2012-10-26 7 views
8

Se ho la seguente dichiarazione all'interno di una classe in cui Synapse è un tipo astratto:Dichiarare un campo lista con la parola finale

private final List<Synapse> synapses; 

Vuol final mi permetterà di essere ancora in grado di cambiare lo stato delle Synapse oggetti nel List, ma mi impedisce di aggiungere nuovi oggetti Synapse all'elenco? Se ho torto, potresti spiegare cosa sta facendo final e quando dovrei usare la parola chiave final.

risposta

20

No, la parola chiave finale non rende l'elenco o il suo contenuto immutabile. Se si desidera un elenco immutabile, è necessario utilizzare:

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

Che la parola finale non fa altro che impedire l'assegnazione di un nuovo valore alla variabile 'sinapsi'. Vale a dire, non si può scrivere:

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

È possibile, tuttavia, scrivere:

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

Vale la pena sottolineare che, anche se nulla può essere aggiunto, rimosso o sostituito in 'unmodifiableList' costruita in questo modo, gli elementi della lista possono avere ancora il loro stato cambiato (se sono mutevole). Nulla sulla dichiarazione di lista o sulla costruzione può impedirlo. –

+0

Quindi è possibile: 'Elenco finale synapses = createList();' e quindi fare 'synapses.add (newSynapse())'? Quindi significa che 'synapses' non può indicare nient'altro che questa lista, giusto? –

+0

@ A.Vieira sì, giusto, a patto che 'synapses' sia un oggetto mutabile come ArrayList. –

4

final ti impedisce di riassegnazionesynapses dopo aver assegnato una volta - è comunque possibile aggiungere/rimuovere gli elementi come si farebbe normalmente. Puoi leggere ulteriori informazioni sulla parola chiave finalhere.

2

È ancora possibile modificare, aggiungere e rimuovere il contenuto dell'elenco, ma non è possibile creare un nuovo elenco assegnato alla variabile.

2

Il Java Language Specification writes:

Una variabile può essere dichiarata finale. Una variabile finale può essere assegnata solo una volta. Dichiarare una variabile finale può servire come documentazione utile che il suo valore non cambierà e può aiutare a evitare errori di programmazione.

È un errore in fase di compilazione se viene assegnata una variabile finale a meno che non sia definitivamente non assegnata (§16) immediatamente prima dell'assegnazione.

Un finale vuoto è una variabile finale la cui dichiarazione non ha un inizializzatore.

Una volta assegnata una variabile finale, contiene sempre lo stesso valore. Se una variabile finale contiene un riferimento a un oggetto, allora lo stato dell'oggetto può essere modificato dalle operazioni sull'oggetto, ma la variabile farà sempre riferimento allo stesso oggetto.

Pertanto, se si vuole rispettare che lo stato raggiungibile tramite la variabile non cambia, è necessario dichiarare la variabile final, utilizzare un elenco non modificabile (per esempio con Collections.unmodifiableList), e fare Synapse oggetti immutabili.

1

L'implementazione finale implica che il riferimento all'oggetto una volta avviato, il riferimento stesso non può mai essere modificato ma il contenuto può naturalmente essere. Non sta violando le regole affatto. Hai specificato una sola regola sulla modifica del riferimento che funziona di conseguenza. Se vuoi che anche i valori non cambino mai dovresti andare per elenchi immutabili.e

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

Vedere la seguente questione correlata.