Ho pensato di scrivere una risposta aggiornata e approfondita qui.
final
la parola chiave può essere utilizzata in diversi punti.
- classi
Un final class
significa che nessun'altra classe può estendere quella classe finale. Quando Java Run Time ( JRE ) sa che un riferimento a un oggetto è nel tipo di una classe finale (diciamo F), sa che il valore di quel riferimento può essere solo nel tipo di F.
Ex:
F myF;
myF = new F(); //ok
myF = someOther; //someOther cannot be in type of a child class of F.
//because F cannot be extended.
Pertanto, quando esegue qualsiasi metodo di tale oggetto, tale metodo non deve essere risolto in fase di esecuzione utilizzando una tabella virtuale . cioè il polimorfismo di runtime non può essere applicato. Quindi il tempo di esecuzione non si preoccupa di questo. Ciò significa che consente di risparmiare tempo di elaborazione, migliorando le prestazioni.
- metodi
Una final method
classe qualsiasi significa che qualsiasi classe figlio che estende quella classe non può sovrascrivere i metodi finali. Quindi il comportamento in fase di esecuzione in questo scenario è anche lo stesso del comportamento precedente che ho citato per le classi.
- campi, variabili locali, parametri del metodo
Se uno ha specificato qualsiasi tipo di sopra come final
, significa che il valore è già finalizzato, quindi il valore non può essere modificato .
Ex:
Per campi, parametri locali
final FinalClass fc = someFC; //need to assign straight away. otherwise compile error.
final FinalClass fc; //compile error, need assignment (initialization inside a constructor Ok, constructor can be called only once)
final FinalClass fc = new FinalClass(); //ok
fc = someOtherFC; //compile error
fc.someMethod(); //no problem
someOtherFC.someMethod(); //no problem
Per i parametri del metodo
void someMethod(final String s){
s = someOtherString; //compile error
}
Ciò significa semplicemente che il valore del valore di final
riferimento non può essere modificato. cioè è consentita una sola inizializzazione. In questo scenario, in fase di esecuzione, poiché JRE sa che i valori non possono essere modificati, carica tutti questi valori finalizzati (dei riferimenti finali) nella cache L1 . Perché non ha bisogno di caricare indietro ancora e ancora dalla memoria principale . Altrimenti carica nella cache L2 e carica di volta in volta dalla memoria principale. Quindi è anche un miglioramento delle prestazioni.
Quindi, in tutti i 3 scenari sopra indicati, quando non abbiamo specificato la final
parola chiave in posti che possiamo usare, non dobbiamo preoccuparci, le ottimizzazioni del compilatore lo faranno per noi. Ci sono anche molte altre cose che le ottimizzazioni del compilatore fanno per noi. :)