Domanda

Che cosa è una variabile finale in Java? Per esempio: se scrivo final int temp; in funzione di quello che è il significato della parola chiave final
? Inoltre, quando dovrei usare variabile finale (sia come variabile di classe e come una variabile di funzione)?
Perché devono variabili in un blocco sincronizzato essere dichiarati finale?

È stato utile?

Soluzione

In pratica significa solo non è possibile modificare il valore. Per variabili di istanza, è necessario assegnare le variabili finali una volta (e solo una volta) nel costruttore (o con un inizializzatore variabile). La sincronizzazione è un concetto piuttosto ortogonale.

Il motivo principale per fare un locale variabile finale è così lo si può utilizzare in una classe interna anonima ... questo non ha nulla a che fare con l'essere in un blocco sincronizzato.

variabili finali sono utile per le classi immutabili, è vero - e l'immutabilità rende la vita più facile in un ambiente multi-threaded - ma questo è l'unica relazione tra i due che mi vengono in mente ...

EDIT: il commento di Wildwezyr ha senso in termini di non cambiare la variabile su cui si esegue la sincronizzazione . Sarebbe pericoloso, per le ragioni che ha dato. E 'questo ciò che si intende per "variabile nel blocco sincronizzato"?

Altri suggerimenti

variabili finali e blocchi di codice sincronizzati hanno qualcosa in comune ... Se si dichiara a variabile non finale e poi scrivete synchronized (a) { System.out.println('xxx'); } avrete avvertimento "Sincronizzazione sul campo non-finale" -. Almeno in NetBeans

Perché non si dovrebbe essere la sincronizzazione sul campo non-finale? Perché se il valore del campo può variare, quindi fili diversi possono essere sincronizzazione su oggetti diversi (differenti valori del campo) -. Modo ci potrebbe essere alcuna sincronizzazione affatto (ogni thread può entrare blocco sincronizzato allo stesso tempo)

Guardate qui ad esempio di problemi di vita reale causato dalla sincronizzazione sul campo non finale: http://forums.sun.com/thread.jspa?threadID=5379204

In aggiunta a quanto detto Jon Skeet, il valore non può essere modificato, ma il contenuto può essere modificato.

final Integer one = new Integer(1);
...
one = new Integer(2); // compile error

final List list = new ArrayList();
...
list = new ArrayList(); // compile error
list.add(1); // Changes list, but that's fine!

anche essere consapevoli che finale finale e statica non sono gli stessi. finale è nell'ambito dell'istanza, mentre statica finale è lo stesso per tutte le istanze di una classe (in altre lingue questo potrebbe essere chiamato una costante).

Personalmente penso che il vantaggio di finale, anche quando non è assolutamente necessario per ottenere il vostro lavoro del software, è nel significato semantico. Vi offre la possibilità di dire al compilatore e la prossima persona che lavora su quel codice che questa variabile non è destinato a essere cambiato, e che cercare di cambiarlo potrebbe tradursi in un bug.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top