2012-10-26 16 views
8

Jeśli mam następujące oświadczenie w klasie gdzie Synapse jest typem streszczenie:Deklarowanie pole listy z końcowym słowa kluczowego

private final List<Synapse> synapses; 

Czy final pozwala mi nadal być w stanie zmienić stan Synapse obiektów w List, ale uniemożliwić dodanie do listy nowych obiektów Synapse? Jeśli się mylę, czy mógłbyś wyjaśnić, co robi final i kiedy powinienem zamiast tego używać słowa kluczowego final.

Odpowiedz

20

Nie, końcowe słowo kluczowe nie powoduje, że lista lub jej zawartość są niezmienne. Jeśli chcesz niezmienna listy, należy użyć:

List<Synapse> unmodifiableList = Collections.unmodifiableList(synapses); 

Co ostateczna kluczowe robi to uniemożliwić przypisanie nowej wartości do zmiennej 'synaps. To znaczy, nie można napisać:

final List<Synapse> synapses = createList(); 
synapses = createNewList(); 

Można jednak napisać:

List<Synapse> synapses = createList(); 
synapses = createNewList(); 
+7

Warto zwrócić uwagę, że choć nic nie może być dodane, usunięte lub zastąpione w 'unmodifiableList' skonstruowany tak, elementy listy można jeszcze ich stan zmienić (jeśli są one zmienny). Nic o deklaracji listy lub konstrukcji nie może temu zapobiec. –

+0

Więc możesz zrobić: 'final List synapses = createList();' a następnie zrobić 'synapses.add (newSynapse())'? Oznacza to, że 'synaps 'nie może wskazywać na nic innego poza tą listą? –

+0

@ A.Vieira tak, tak, o ile 'synapses' jest zmiennym obiektem takim jak ArrayList. –

4

final uniemożliwia realokacjasynapses po przypisaniu go raz - można jeszcze dodać/usunąć elementy tak jak zwykle. Możesz przeczytać więcej na temat słowa kluczowego finalhere.

2

Nadal można zmieniać, dodawać i usuwać zawartość listy, ale nie można utworzyć nowej listy przypisanej do zmiennej.

2

języka Java Specification writes:

Zmienna może być uznana za ostateczne. Ostatnia zmienna może być przypisana tylko raz. Zgłaszanie zmiennych końcowych może służyć jako przydatna dokumentacja, której wartość nie ulegnie zmianie i może pomóc uniknąć błędów programistycznych.

Jest to błąd podczas kompilacji, jeśli przypisano ostatnią zmienną, o ile nie jest definitywnie nieprzypisana (§ 16) bezpośrednio przed przypisaniem.

Pusty finał jest ostatnią zmienną, której deklaracja nie zawiera inicjalizatora.

Po przypisaniu ostatniej zmiennej, zawsze zawiera tę samą wartość. Jeśli ostatnia zmienna zawiera odniesienie do obiektu, wówczas stan obiektu może zostać zmieniony przez operacje na obiekcie, ale zmienna zawsze będzie odnosić się do tego samego obiektu.

Dlatego, jeśli chcesz wymusić, że stan osiągalny za pośrednictwem zmiennej nie zmienia, trzeba zadeklarować zmienną final, użyj niemodyfikowalne listy (na przykład z Collections.unmodifiableList) i upewnij Synapse obiekty niezmienne.

1

Ostateczne wdrożenie oznacza, że ​​odwołanie do obiektu po jego uruchomieniu, samo odniesienie nie może zostać zmienione, ale zawartość może oczywiście być. Nie narusza to w ogóle zasad. Podano tylko jedną regułę dotyczącą zmiany referencyjnej, która działa prawidłowo. Jeśli chcesz, aby wartości również się nie zmieniały, powinieneś iść do niezmiennych list i.e

List<String> items = Collections.unmodifiableList(Arrays.asList("a", "b", "c")); 

Zobacz następujące powiązane pytanie.

Powiązane problemy