如何创建一个方法来改变 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。
用两个名为 TIME
和 HEART
.
的对象定义一个枚举 DisplayMode
enum DisplayMode { TIME , HEART ; }
将您的布尔成员字段替换为名为 currentDisplayMode
的 DisplayMode
类型的字段,用于存储两个枚举对象中的任何一个。测试每个枚举对象的存在,以确定哪种文本 return 用于您的 getDisplayText
方法。
当然,在每次请求时用一个对象替换另一个对象,而不是翻转布尔值。也许在枚举 class 上定义一个 rotate
方法来获取下一个枚举对象。
使用枚举而不是布尔值还有另一个好处:当您可能有额外的显示模式(超过两种)时,枚举可以为将来做准备。
toString
适用于程序员和测试人员,不适用于用户
不要在任何此业务逻辑中覆盖 toString
。将您的 toString
方法定义为 return 用于调试和记录时有意义的文本。 toString
方法不适用于用户界面。
java.time
不要重新发明计时。 Java 拥有行业领先的日期时间处理框架 java.time。所以用它。
没有日期和 zone/offset 的时间由 LocalTime
表示。
但在真正的手表中,您会在内部跟踪 Instant
。对于用户界面,您可以应用时区 (ZoneId
) 以获得 ZonedDateTime
。然后,您将使用用户选择的 Locale
和 DateTimeFormatter.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
一些要点:
- 您不需要使用
Integer#toString
将 hr
、min
或 sec
转换为 String
。当您将字符串添加到 int
时,此转换会自动发生。请注意上面显示的 toString
实现中的这一变化。
- 始终遵循 Java naming conventions 例如你的 class 的名字应该是
SportWatch
而不是 sportWatch
.
如何创建一个方法“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。
用两个名为 TIME
和 HEART
.
DisplayMode
enum DisplayMode { TIME , HEART ; }
将您的布尔成员字段替换为名为 currentDisplayMode
的 DisplayMode
类型的字段,用于存储两个枚举对象中的任何一个。测试每个枚举对象的存在,以确定哪种文本 return 用于您的 getDisplayText
方法。
当然,在每次请求时用一个对象替换另一个对象,而不是翻转布尔值。也许在枚举 class 上定义一个 rotate
方法来获取下一个枚举对象。
使用枚举而不是布尔值还有另一个好处:当您可能有额外的显示模式(超过两种)时,枚举可以为将来做准备。
toString
适用于程序员和测试人员,不适用于用户
不要在任何此业务逻辑中覆盖 toString
。将您的 toString
方法定义为 return 用于调试和记录时有意义的文本。 toString
方法不适用于用户界面。
java.time
不要重新发明计时。 Java 拥有行业领先的日期时间处理框架 java.time。所以用它。
没有日期和 zone/offset 的时间由 LocalTime
表示。
但在真正的手表中,您会在内部跟踪 Instant
。对于用户界面,您可以应用时区 (ZoneId
) 以获得 ZonedDateTime
。然后,您将使用用户选择的 Locale
和 DateTimeFormatter.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
一些要点:
- 您不需要使用
Integer#toString
将hr
、min
或sec
转换为String
。当您将字符串添加到int
时,此转换会自动发生。请注意上面显示的toString
实现中的这一变化。 - 始终遵循 Java naming conventions 例如你的 class 的名字应该是
SportWatch
而不是sportWatch
.