Как объявить метод, который не может изменять члены класса в Java? [дубликат]

Nov 30 2020

В C ++ мы используем метод констант, поэтому он не может изменять значения членов класса, но как я могу это сделать в Java? Я попробовал объявить окончательный метод, который был бы эквивалентен константам в C ++, но финальные методы - совсем другое дело. Я хочу создать метод получения, чтобы он не мог изменять значения, а только читал его. Как метод только для чтения.

Ответы

10 AlexShesterov Nov 30 2020 at 17:16

В Java невозможно декларативно запретить методу изменять неокончательные поля. В Java не существует такой вещи, как "корректность констант".

Если поле класса не- final, то его можно изменить любым методом класса.

Обратите внимание, что finalработа с полями и переменными отличается от методов и классов:

  • finalПоле или переменная является константой. Его значение нельзя изменить после назначения.
  • finalМетод не может быть переопределены дочерними классами. finalon методы не имеет ничего общего с «константностью».
  • finalКласс не может быть продлен. finalна классы не имеет ничего общего с «константностью».

Ваши варианты в Java:

  1. Сделайте свой класс неизменным (т.е. отметьте все его поля final).
  2. Просто внимательно напишите свои геттеры (и другие немутаторные методы) :)

Еще одно замечание. Даже в отношении полей и переменных Java finalотличается от C ++ const. Например:

  • finalпеременные не могут быть изменены после назначения, но вы можете назначить их после объявления. Пример:

      final int value;
      if (condition) {
          value = 1; // Ok!
      } else {
          value = 2; // Ok!
      }
      value = 3; // Compile error: value already assigned.
    
  • finalполя класса должны быть назначены - напрямую или из конструктора. Но эти поля могут быть назначены где угодно в конструкторе. В Java нет ничего особенного, как "список инициализаторов" C ++.

  • Объявление поля / переменной / параметра final Object objв Java примерно эквивалентно (const-) ссылке на неконстантный объект в C ++. Это означает, что вы не можете повторно назначить ссылку , но вы можете изменить сам объект, на который указывает ссылка. Пример:

      // Note that (obsolete) Date class is mutable in Java.
      final Date myDate = new Date();
    
      myDate = new Date(); // Compilation error: can't reassign a final reference!
    
      myDate.setTime(4711); // Ok, mutating referenced object is allowed!
    
salapura.stefan Nov 30 2020 at 17:17

Ты не можешь сделать это. Последний метод означает, что его нельзя отменить.