java—如何创建一个方法来更改tostring方法提供的内容?

qmelpv7a  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(290)

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

13天前关门了。
改进这个问题
如何创建一个“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方法。
另外,这是设定心率的方法

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

最终输出应如下所示:
时间:0:0:0
心率:91
每次我使用changedisplay方法时,它都应该在时间和心率之间切换。

arknldoa

arknldoa1#

翻转布尔值作为标志

正如hö亨纳,创造一个 boolean 您的帐户上的成员字段 SportWatch 班级。使用if-then测试来确定返回的是一种文本还是另一种文本、心跳还是当前时间。每次调用你的方法 getDisplayText ,在返回所需文本时翻转该真/假值。
如果你的目标 SportWatch 可以跨线程使用,请使用类型为的成员字段 AtomicBoolean . (您还需要进行其他更改以使代码线程安全。)

枚举而不是布尔值

要使代码更具自文档性,请使用enum对象,而不仅仅是布尔值true/false。
定义枚举 DisplayMode 有两个名为 TIME 以及 HEART .

enum DisplayMode { TIME , HEART ; }

将布尔成员字段替换为类型为的字段 DisplayMode 命名 currentDisplayMode 存储两个枚举对象之一。测试每个enum对象是否存在,以确定要返回的文本类型 getDisplayText 方法。
当然,在每个请求中用另一个对象替换一个对象,而不是翻转布尔值。或许可以定义一个 rotate 方法来获取下一个枚举对象。
使用枚举而不是布尔值还有另一个好处:枚举为将来可能有两种以上的其他显示模式做准备。

tostring是为程序员和测试人员提供的,而不是为用户提供的

不涉及对 toString 在任何业务逻辑中。定义您的 toString 方法返回在用于调试和日志记录时有意义的文本。这个 toString 方法不打算在用户界面中使用。

java.time文件

不要重复计时。java拥有业界领先的日期时间处理框架java.time。所以用它。
一天中没有日期和区域/偏移的时间由表示 LocalTime .
但在真正的手表里,你会跟踪 Instant 内部。对于用户界面,可以应用时区( ZoneId )得到一个 ZonedDateTime . 然后,您将使用用户选择的 LocaleDateTimeFormatter.ofLocalizedTime .
所有这些都已经在stackmoverflow上讨论过很多次了。因此,搜索以了解更多信息。

trnvg8h3

trnvg8h32#

在您的类中,您可以创建 boolean 用于跟踪显示状态的变量,例如on 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, 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 ,或 secString 通过使用 Integer#toString . 将字符串添加到 int ,此转换将自动进行。注意我内心的变化 toString 实现如上所示。
始终遵循java命名约定,例如,类的名称应该是 SportWatch 而不是 sportWatch .

ioekq8ef

ioekq8ef3#

我认为应该在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 ;
}

相关问题