如何创建一个方法来改变 toString 方法提供的内容?

How to create a method that changes what the toString method delivers?

如何创建一个方法“public void changeDisplay()”来更改 toString 方法提供的内容?

所以,说清楚。这是一个例子。

主要方法:

    sportWatch s = new sportWatch(0, 0, 0);
    System.out.println(s);
    s.setHeartRate(91);
    s.changeDisplay();
    System.out.println(s);

打印对象时 -> 输出:

时间:0:0:0

时间:0:0:0

由于 SportWatch 中的方法 toString() class。

public String toString() {
    String secStr = Integer.toString(this.sec);
    String minStr = Integer.toString(this.min);
    String hrStr = Integer.toString(this.hr);
    return "Time: "+ hrStr + ":" + minStr + ":" + secStr ;
}

我不知道如何编写一个在时间和心率之间切换的changeDisplay方法。

PS。这是 setHeartRate

的方法
public void setHeartRate(int value) {
    this.heartRate = value;
}

最终输出应如下所示:

时间:0:0:0

心率:91

每次我使用 changeDisplay 方法时,它应该在时间和心率之间切换。

翻转一个布尔值作为标志

作为 ,在您的 SportWatch class 上创建一个 boolean 成员字段。使用 if-then 测试来确定您 return 一种文本还是另一种文本,心跳或当前时间。在每次调用您的方法 getDisplayText 时,翻转 true/false 值,同时 return 输入所需的文本。

如果您的 SportWatch 的对象可以跨线程使用,请使用 AtomicBoolean 类型的成员字段。 (您还需要进行其他更改以使您的代码线程安全。)

枚举而不是布尔值

为了使您的代码更加自文档化,请使用枚举对象而不是单纯的布尔值 true/false。

用两个名为 TIMEHEART.

的对象定义一个枚举 DisplayMode
enum DisplayMode { TIME , HEART ; }

将您的布尔成员字段替换为名为 currentDisplayModeDisplayMode 类型的字段,用于存储两个枚举对象中的任何一个。测试每个枚举对象的存在,以确定哪种文本 return 用于您的 getDisplayText 方法。

当然,在每次请求时用一个对象替换另一个对象,而不是翻转布尔值。也许在枚举 class 上定义一个 rotate 方法来获取下一个枚举对象。

使用枚举而不是布尔值还有另一个好处:当您可能有额外的显示模式(超过两种)时,枚举可以为将来做准备。

toString 适用于程序员和测试人员,不适用于用户

不要在任何此业务逻辑中覆盖 toString。将您的 toString 方法定义为 return 用于调试和记录时有意义的文本。 toString 方法不适用于用户界面。

java.time

不要重新发明计时。 Java 拥有行业领先的日期时间处理框架 java.time。所以用它。

没有日期和 zone/offset 的时间由 LocalTime 表示。

但在真正的手表中,您会在内部跟踪 Instant。对于用户界面,您可以应用时区 (ZoneId) 以获得 ZonedDateTime。然后,您将使用用户选择的 LocaleDateTimeFormatter.ofLocalizedTime.

自动本地化

所有这些都已在 StackmOverflow 上多次介绍。所以搜索以了解更多信息。

我认为你应该在 toString 方法中获取参数。 您可以添加一个枚举来确定您应该使用哪种格式,如下所示。

public enum TypeOfSportWatchFormat{
      ToLongString,
      ToShortString
      //add special enums you need
}

在您的 toString 方法中采用 TypeOfSportWatchFormat 参数

public String toString(TypeOfSportWatchFormat format){

   //use if or switch case to return your format
  // i prefer switch for speed
    String secStr = Integer.toString(this.sec);
    String minStr = Integer.toString(this.min);
    String hrStr = Integer.toString(this.hr);
    return "Time: "+ hrStr + ":" + minStr + ":" + secStr ;
}

在您的 class 中,您可以创建一个 boolean 变量来跟踪显示状态,例如在 changeDisplay() 上,它会将值设置为 true,在 resetDisplay() 上,它会将值设置为 false。现在,toString() 函数可以 return 利用此变量的值。

class SportWatch {
    // ...Other variables
    private int heartRate;
    private boolean displayHeartRate;

    // ...Constructors and other methods

    public void changeDisplay() {
        displayHeartRate = true;
    }

    public void resetDisplay() {
        displayHeartRate = false;
    }

    public String toString() {
        String returnValue = "Time: " + hr + ":" + min + ":" + sec;

        // If displayHeartRate is true append the caption and value of heartRate;
        if (displayHeartRate) {
            returnValue += System.lineSeparator() + "Heart rate: " + heartRate;
        }

        return returnValue;
    }
}

用法:

SportWatch s = new SportWatch(0, 0, 0);
System.out.println(s);
System.out.println();
s.setHeartRate(91);
s.changeDisplay();
System.out.println(s);
System.out.println();
//...
s.resetDisplay();
System.out.println(s);

输出:

Time: 0:0:0

Time: 0:0:0
Heart rate: 91

Time: 0:0:0

一些要点:

  1. 您不需要使用 Integer#toStringhrminsec 转换为 String。当您将字符串添加到 int 时,此转换会自动发生。请注意上面显示的 toString 实现中的这一变化。
  2. 始终遵循 Java naming conventions 例如你的 class 的名字应该是 SportWatch 而不是 sportWatch.