如何解决如何创建一个方法来改变 toString 方法提供的内容?
如何创建一个方法“public void changeDisplay()”来改变 toString 方法提供的内容?
所以,要说清楚。这是一个例子。
主要方法:
sportWatch s = new sportWatch(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 方法。
附注。这里是 setHeartRate 的方法
public void setHeartRate(int value) {
this.heartRate = value;
}
最终输出应如下所示:
时间:0:0:0
心率:91
而且每次我使用changeDisplay方法时,它应该在时间和心率之间切换。
解决方法
翻转布尔值作为标志
作为 commented by Höhener,在您的 boolean
类上创建一个 SportWatch
成员字段。使用 if-then 测试来确定您返回的是一种文本还是另一种文本,心跳还是当前时间。在每次调用您的方法 getDisplayText
时,在返回所需文本的同时翻转该真/假值。
如果您的 SportWatch
对象可以跨线程使用,请使用 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
。然后,您将使用用户选择的 Locale
和 DateTimeFormatter.ofLocalizedTime
自动本地化。
StackmOverflow 上已经多次介绍了所有这些。所以搜索以了解更多信息。
,在您的课程中,您可以创建一个 boolean
变量来跟踪显示状态,例如在 changeDisplay()
上,它会将值设置为 true
,而在 resetDisplay()
上,它会将值设置为 false
。现在,toString()
函数可以利用该变量的值返回值。
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);
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
一些要点:
- 您无需使用
hr
将min
、sec
或String
转换为Integer#toString
。当您将字符串添加到int
时,此转换会自动发生。请注意上面显示的toString
实现中的这一更改。 - 始终遵循 Java naming conventions 例如您的班级名称应为
SportWatch
而不是sportWatch
。
我认为您应该在 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 ;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。