Jak zadeklarować metodę, która nie może zmienić członków klasy w Javie? [duplikować]

Nov 30 2020

W C ++ robimy metodę stałą, więc nie można zmienić wartości składowych klasy, ale jak mogę to zrobić w Javie? Wypróbowałem ostateczną deklarację metody, która byłaby odpowiednikiem stałych w C ++, ale metody końcowe to inna sprawa. Chcę utworzyć metodę pobierającą, aby nie mogła zmieniać wartości, tylko ją czytać. Jak metoda tylko do odczytu.

Odpowiedzi

10 AlexShesterov Nov 30 2020 at 17:16

W Javie nie jest możliwe deklaratywne zapobieganie zmianie pól innych niż końcowe przez metodę. W Javie nie ma czegoś takiego jak „stała poprawność”.

Jeśli pole klasy jest inne niż - final, można je zmienić dowolną metodą tej klasy.

Zauważ, że finaldziała inaczej na polach i zmiennych niż na metodach i klasach:

  • finalPola lub zmienna jest stała. Po przypisaniu jego wartości nie można zmienić.
  • finalMetoda nie może być przesłonięta przez klasach potomnych. finalmetod nie ma nic wspólnego z „stałością”.
  • finalKlasa nie może zostać przedłużony. finalna klasach nie ma nic wspólnego z „stałością”.

Twoje opcje w Javie to:

  1. Uczyń swoją klasę niezmienną (tj. Zaznacz wszystkie jej pola final).
  2. Po prostu ostrożnie napisz swoje metody pobierające (i inne metody niemutujące) :)

Jeszcze jedna uwaga. Nawet jeśli chodzi o pola i zmienne, Java finalróżni się od C ++ const. Na przykład:

  • finalzmiennych nie można zmienić po przypisaniu, ale można je przypisać po deklaracji. Przykład:

      final int value;
      if (condition) {
          value = 1; // Ok!
      } else {
          value = 2; // Ok!
      }
      value = 3; // Compile error: value already assigned.
    
  • finalpola klas muszą być przypisane - bezpośrednio lub z poziomu konstruktora. Ale te pola mogą być przypisane w dowolnym miejscu w konstruktorze. W Javie nie ma specjalnej rzeczy, takiej jak „lista inicjalizacyjna” C ++.

  • Deklaracja pola / zmiennej / parametru final Object objw Javie jest z grubsza odpowiednikiem (stałej) referencji do obiektu innego niż stała w C ++. Oznacza to, że ty nie może ponownie przypisać odniesienie , ale może zmienić sam obiekt odwołuje. Przykład:

      // 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

Nie możesz tego zrobić. Ostateczna metoda oznacza, że ​​nie można jej zastąpić.