Regola generale: non utilizzarlo.
Final
non può fermarti a cambiare oggetti, solo il suo riferimento, e questo perché gli oggetti in java sono, di solito, non immutabili.
Date un'occhiata a questo codice:
class Example{
// think about this class as a simple wrapper, a facade or an adapter
SomeClass inner = new SomeClass();
setInnet(Someclass inner){
this.inner = inner;
}
// delegate methods.....
}
Ora, in un metodo:
private void (final Example examp){
....
examp
sarà sempre lo stesso oggetto, ma può variare a inner
... Ed è il inner
oggetto importante qui, quello che rende tutto!
Questo potrebbe essere un esempio estremo e si potrebbe pensare che inner
potrebbe essere definitivo ma, se è una classe utillery, forse non dovrebbe. Inoltre è facile trovare un esempio più comune:
public void (final Map map){;
....
//funny things
....
//and then, in a line, someone does:
map.clear()
// no we have the same reference... but the object has change...
....
Quindi, il mio punto contro final
negli argomenti è che non è garantito che tutto il codice all'interno di una classe final
è inmutable e così la parola final
può finire si trova e che mascarading un bug ...
Inserendo final
in parametri puoi mostrare solo i desideri, non i fatti, e per questo dovresti usare i commenti, non il codice. Inoltre: è uno standard (di fatto) in Java che tutti gli argomenti sono solo argomenti di input (99% del codice). Pertanto, la parola final
in param è NOISE perché esiste e non significa nulla.
E il rumore non mi piace. Quindi cerco di evitarlo.
Uso solo la parola final
per contrassegnare le variabili interne che verranno utilizzate in una classe interna anonima (è possibile evitare di contrassegnarlo se sono effettivamente definitive, ma è più pulito e più leggibile).
AGGIORNAMENTO
mezzi finali assegnati una volta 'che in applicata ad argomenti metodo significa nulla nella logica di un programma, né nella sua progettazione.
È possibile assegnare gli argomenti a un nuovo oggetto all'interno di un metodo e all'esterno non ci saranno cambiamenti.
L'unica differenza nel mettere gli argomenti finali è che non sarà possibile assegnare quelle entità a un altro oggetto. Assegnare argomenti è qualcosa che può essere brutto e qualcosa da evitare, ma è solo un problema di stile e, a quel punto, il problema di stile dovrebbe essere l'assegnazione stessa e non l'ausilio della parola 'finale'.
Penso che la finale sia inutile in argomenti (e quindi, rumore), ma se qualcuno è in grado di trovarne un uso, sarò felice di impararlo. Cosa posso ottenere mettendo 'finale' che non può raggiungere senza metterlo?
È possibile sostituire il valore passato per un oggetto alternativo in determinate circostanze. Ma sì, è raro –
Non sempre "rendere il parametro" (non argomento) inutile. Ad esempio, è * ragionevolmente * comune eseguire alcune normalizzazioni di input, riutilizzando il parametro: 'text = StringUtil.nullToEmpty (text);' ad esempio. –
A proposito, uno dei punti nella risposta alla domanda collegata, che devi contrassegnare un argomento 'final' per usarlo in una classe interna anonima, non è più vero in Java 8. – ajb