Как создать метод, который изменяет то, что предоставляет метод 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

Из-за метода 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, он должен переключаться между временем и частотой сердечных сокращений.

Это НЕ то, для чего toString должен использоваться. Именно для этого вы должны написать метод getDisplayString.

luk2302 26.12.2020 18:15

Создайте логическое поле displayTime. Добавьте оператор if-else внутри toString.

Reto Höhener 26.12.2020 18:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
78
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Перевернуть логическое значение как флаг

Как прокомментировал 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 имеет ведущую в отрасли структуру обработки даты и времени java.time. Так что используйте его.

Время суток без даты и без зоны/смещения представлено LocalTime.

Но в настоящих часах вы будете отслеживать Instant внутренне. Для пользовательского интерфейса вы должны применить часовой пояс (ZoneId), чтобы получить ZonedDateTime. Затем вы автоматически локализуете, используя выбор пользователя Locale с DateTimeFormatter.ofLocalizedTime.

Все это уже много раз освещалось на StackmOverflow. Так что ищите, чтобы узнать больше.

Отличные предложения! Спасибо за ваше постоянное стремление обучать новичков и помогать опытным программистам совершенствоваться.

Arvind Kumar Avinash 26.12.2020 19:33

Как только вы получите это перечисление, вы можете сделать это implements Function<SportWatch, String>...

chrylis -cautiouslyoptimistic- 26.12.2020 20:50

Я думаю, вам следует взять параметр в методе 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

Некоторые важные моменты:

  1. Вам не нужно конвертировать hr, min или sec в String с помощью Integer#toString. Когда вы добавляете строку в int, это преобразование происходит автоматически. Обратите внимание на это изменение в моей реализации toString, показанной выше.
  2. Всегда следуйте соглашениям об именах Java, например. имя вашего класса должно быть SportWatch вместо sportWatch.

Другие вопросы по теме