2011-11-29 20 views
28

Eventuali duplicati:
Why would one mark local variables and method parameters as “final” in Java?variabile finale di metodi in Java

stavo controllando po 'di codice Java, io non sono bravo a java almeno avere qualche conoscenza quello finale fa come classi sigillate, campi readonly e metodi non sostituibili, ma questo mi sembra strano, dichiarando una variabile

Potrebbe dirmi qual è il significato di final in questo contesto?

Ecco il codice completo:

http://code.google.com/p/google-api-java-client/source/browse/books-cmdline-sample/src/main/java/com/google/api/services/samples/books/cmdline/BooksSample.java?repo=samples

risposta

31

Rende semplicemente la variabile locale books immutabile. Ciò significa che sarà sempre un riferimento allo stesso oggetto Book creato e creato e che non può essere modificato per fare riferimento a un altro oggetto o null.

L'oggetto Book è ancora modificabile come si può vedere dalla sequenza di chiamate di accesso. Solo il riferimento ad esso non lo è.

+1

E 'da notare che l'oggetto puntato da Books * è * mutevole? –

+1

@Doug: Sì, l'ho appena aggiunto alla mia risposta. Grazie. – BoltClock

+0

+1 poi (una goccia nello stagno però ..) –

1

Sono abbastanza sicuro che non significhi altro che la variabile libri non può essere sovrascritta più avanti nel metodo.

3

Questo rende anche la variabile di riferimento di sola lettura. Di solito, questo è per proteggere il codice dalla modifica accidentale di una variabile che non deve cambiare.

+0

'finale' significa più in questo contesto. –

9

In questo caso, final Books books significa semplicemente che a books deve essere assegnato un valore esattamente una volta.

Mi piace utilizzare la parola chiave final come questo in quanto mostra l'intento della variabile, che trovo essere informazioni preziose quando si guarda il codice in quanto rimuove ancora un'altra variabile dalla situazione ... per così dire.

Se I non è contrassegnare una variabile come final, quindi si distingue come qualcosa da tenere d'occhio perché cambierà valori a breve. Questa informazione è utile mentre, ad esempio, si passa attraverso il codice nel debugger o si esegue il refactoring del codice &.

+0

'finale' significa più in questo contesto. –

+0

+1 per il collegamento, eccellente spiegazione! – NguyenDat

1

Questo codice utilizza classe anonima JsonHttpRequestInitializer, dove si fa riferimento alla variabile locale nel metodo queryGoogleBooks, il problema in questo tipo di situazione è che la Il metodo queryGoogleBooks potrebbe essere restituito prima che il metodo di inizializzazione di JsonHttpRequestInitializer sia completato, in cui potrebbe eseguire il cleanup della variabile e causare il fallimento del metodo di inizializzazione di JsonHttpRequestInitializer. Quindi è necessario dichiarare le variabili come finali in questo tipo di situazioni.Per ulteriori informazioni si veda,

Cannot refer to a non-final variable inside an inner class defined in a different method

+1

La classe anonima non ha riferimenti alla variabile libri. Se lo facesse ci sarebbe un errore di compilazione, dal momento che la classe anonima viene creata prima dell'inizializzazione della variabile. –

Problemi correlati