首页 > 解决方案 > 如何创建一个改变 toString 方法提供的方法?

问题描述

如何创建一个方法“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() 方法。

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 方法时,它都应该在时间和心率之间切换。

标签: javamethodstostring

解决方案


将布尔值翻转为标志

正如Höhener 所评论的,在您的班级上创建一个boolean成员字段。SportWatch使用 if-then 测试来确定您是返回一种文本还是另一种,心跳或当前时间。在每次调用您的方法getDisplayText时,翻转该真/假值,同时返回所需的文本。

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

枚举而不是布尔值

为了使您的代码更具自我记录性,请使用枚举对象而不是单纯的布尔值 true/false。

DisplayMode用两个名为TIME和的对象定义一个枚举HEART

enum DisplayMode { TIME , HEART ; }

将您的布​​尔成员字段替换为DisplayMode名为currentDisplayMode存储两个枚举对象之一的类型的字段。getDisplayText测试每个枚举对象的存在以确定为您的方法返回哪种类型的文本。

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

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

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

不要toString在任何此业务逻辑中涉及覆盖。定义您的toString方法以返回在用于调试和记录时有意义的文本。该toString方法不打算在用户界面中使用。

java.time

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

没有日期且没有区域/偏移量的时间由 表示LocalTime

但在真正的手表中,您将在Instant内部进行跟踪。对于用户界面,您将应用时区 ( ZoneId) 来获取ZonedDateTime. 然后,您将使用用户选择的Localewith自动进行本地化DateTimeFormatter.ofLocalizedTime

所有这些已经在 StackmOverflow 上多次介绍过。因此,搜索以了解更多信息。


推荐阅读