Как создать метод «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
Из-за метода toString() в классе SportWatch.
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, он должен переключаться между временем и частотой сердечных сокращений.
Создайте логическое поле displayTime
. Добавьте оператор if-else внутри toString
.
Как прокомментировал Höhener, создайте поле boolean
участника в своем SportWatch
классе. Используйте тест «если-тогда», чтобы определить, возвращаете ли вы один тип текста или другой, сердцебиение или текущее время. При каждом вызове вашего метода getDisplayText
переворачивайте это значение true/false, возвращая нужный текст.
Если объект вашего SportWatch
может использоваться в потоках, используйте поле-член типа AtomicBoolean. (Вам также потребуются другие изменения, чтобы сделать ваш код потокобезопасным.)
Чтобы сделать ваш код более самодокументированным, используйте объекты перечисления, а не просто логическое значение true/false.
Определите перечисление DisplayMode
с двумя объектами с именами TIME
и HEART
.
enum DisplayMode { TIME , HEART ; }
Замените поле логического члена полем типа DisplayMode
с именем currentDisplayMode
, хранящим любой из двух объектов перечисления. Проверьте наличие каждого объекта перечисления, чтобы определить, какой тип текста будет возвращен для вашего метода getDisplayText
.
И, конечно же, заменять один объект другим при каждом запросе вместо того, чтобы переворачивать логическое значение. Возможно, определите метод rotate
в классе перечисления, чтобы получить следующий объект перечисления.
Использование перечисления вместо логического имеет еще одно преимущество: перечисление готовится к будущему, когда у вас могут быть дополнительные режимы отображения, более двух.
toString
для программистов и тестировщиков, а не для пользователейНе используйте переопределение toString
ни в одной из этих бизнес-логик. Определите свой метод toString
для возврата текста, который имеет смысл при использовании для отладки и ведения журнала. Метод toString
не предназначен для использования в пользовательском интерфейсе.
Не изобретайте хронометраж. Java имеет ведущую в отрасли структуру обработки даты и времени java.time. Так что используйте его.
Время суток без даты и без зоны/смещения представлено LocalTime
.
Но в настоящих часах вы будете отслеживать Instant
внутренне. Для пользовательского интерфейса вы должны применить часовой пояс (ZoneId
), чтобы получить ZonedDateTime
. Затем вы автоматически локализуете, используя выбор пользователя Locale
с DateTimeFormatter.ofLocalizedTime
.
Все это уже много раз освещалось на StackmOverflow. Так что ищите, чтобы узнать больше.
Отличные предложения! Спасибо за ваше постоянное стремление обучать новичков и помогать опытным программистам совершенствоваться.
Как только вы получите это перечисление, вы можете сделать это implements Function<SportWatch, String>
...
Я думаю, вам следует взять параметр в методе 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 ;
}
В своем классе вы можете создать переменную 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, 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
, показанной выше.SportWatch
вместо sportWatch
.
Это НЕ то, для чего
toString
должен использоваться. Именно для этого вы должны написать методgetDisplayString
.