final
Deklaruje odniesienie do obiektu, którego nie można zmodyfikować, np.
private final Foo something = new Foo();
tworzy nowy Foo
i umieszcza odniesienie w something
.Następnie nie można zmienić something
, aby wskazać inne wystąpienie Foo
.
To robi nie zapobiec modyfikacji wewnętrznego stanu obiektu. Nadal mogę zadzwonić, niezależnie od metody na Foo
są dostępne dla odpowiedniego zakresu. Jeśli jedna lub więcej z tych metod modyfikuje stan wewnętrzny tego obiektu, to nie zapobiegnie to.
Jako takie, następujące:
private final Set<String> fixed = new HashSet<String>();
nie nie utworzyć Set
, które nie mogą być dodawane do lub w inny sposób zmianom; oznacza to tylko, że fixed
będzie tylko odwoływać się do tej instancji.
Natomiast robi:
private Set<String> fixed = Collections.unmodifiableSet(new HashSet<String>());
tworzy instancję Set
który rzuci UnsupportedOperationException
jeśli ktoś próbuje zadzwonić fixed.add()
lub fixed.remove()
, na przykład - sam obiekt będzie chronić swój stan wewnętrzny i uniemożliwić być modyfikowanym.
Dla dobra kompletności:
private final Set<String> fixed = Collections.unmodifiableSet(new HashSet<String>());
tworzy instancję Set
który nie pozwoli jej stan wewnętrzny może zostać zmieniona, a także oznacza, że fixed
będzie zawsze tylko wskazywać na wystąpienie tego zestawu.
Powodem, dla którego final
można użyć do utworzenia stałych prymitywów, jest fakt, że wartości nie można zmienić. Pamiętaj, że powyższa fixed
była tylko referencją - zmienną zawierającą adres, którego nie można zmienić. Cóż, dla prymitywów, np.
private final int ANSWER = 42;
wartość ANSWER
jest 42. Od ANSWER
nie mogą być zmieniane, to tylko kiedykolwiek miał wartość 42.
przykład, który zaciera wszystkie linie będzie to:
private final String QUESTION = "The ultimate question";
Zgodnie z powyższymi regułami, QUESTION
zawiera adres instancji String
, która stanowi "Ostateczne pytanie", którego adresu nie można zmienić. Należy pamiętać, że sama nazwa String
jest niezmienna - nie można nic zrobić z instancją String
, która zmienia ją, a wszelkie operacje, które w przeciwnym wypadku byłyby wykonywane (np. replace
, substring
itd.), Zwracają odwołania do zupełnie innych wystąpienia String
.
Dobra wiadomość. W skrócie, _reference_ nie może być zmieniony, ale _contents_ obiektu * może *. – extraneon