Jak zadeklarować metodę, która nie może zmienić członków klasy w Javie? [duplikować]
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
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 final
działa inaczej na polach i zmiennych niż na metodach i klasach:
final
Pola lub zmienna jest stała. Po przypisaniu jego wartości nie można zmienić.final
Metoda nie może być przesłonięta przez klasach potomnych.final
metod nie ma nic wspólnego z „stałością”.final
Klasa nie może zostać przedłużony.final
na klasach nie ma nic wspólnego z „stałością”.
Twoje opcje w Javie to:
- Uczyń swoją klasę niezmienną (tj. Zaznacz wszystkie jej pola
final
). - 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 final
różni się od C ++ const
. Na przykład:
final
zmiennych 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.
final
pola 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 obj
w 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!
Nie możesz tego zrobić. Ostateczna metoda oznacza, że nie można jej zastąpić.