Ho appena trovato un codice che mi confonde leggermente; ci sono davvero 2 variazioni che vorrei chiarire.Una variabile finale passata in Java rimane definitiva sull'altro lato?
Esempio 1:
public String getFilepath(){
final File file = new File(this.folder, this.filename);
return file.getAbsolutePath();
}
Quale sarebbe lo scopo di dichiarare file
"final
"? Poiché le primitive Java vengono passate in base al valore e getAbsolutePath()
restituisce semplicemente un valore String
, la variabile non sarà final
sull'altro lato (metodo di chiamata), vero? E poiché la variabile file
esiste solo nell'ambito di queste 2 righe, non riesco a vedere alcuno scopo della parola chiave final
. C'è qualcosa che mi manca? Qualcuno vede una ragione per farlo?
Esempio 2:
public String getFilepath(){
final File file = new File(this.folder, this.filename);
return file;
}
Da qui l'oggetto effettivo viene restituita ... Vuol dire che la variabile file
sarà costante/final
sull'altro lato ...? Non sembra avere senso.
In generale, mi sembra di passare una variabile, senza il tipo di accesso. Come in, posso avere una variabile private
in una funzione con una funzione get di public
che la restituisce, ma la variabile che la riceve chiamando la funzione deve specificare un modificatore di accesso. Quindi, se specifica public
, la variabile restituita sarà public
in tale ambito. Se specifica private
, la variabile restituita sarà private
in tale ambito. C'è una differenza con final
? La "costanza" di una variabile è qualcosa che può essere passato? Questo mi sembra piuttosto improbabile, considerando quello che so di Java.
O mi manca completamente il punto e c'è qualche altro scopo della parola chiave final
nel codice sopra?
Edit:
ho controllato di nuovo con lo sviluppatore originale che ha scritto il codice, e ha detto che solo mettere la parola final
in perché aveva inizialmente pensato il metodo sarebbe molto più a lungo e ha voluto per garantire che il file è rimasto costante per tutto il tempo. Ha anche detto che in genere dichiara variabili che non dovrebbero essere modificate come final
, come regola generale e in linea di principio - un punto che entrambe le risposte di seguito menzionate. Quindi sembra che stavo leggendo troppo in una semplice parola chiave extra inclusa per motivi standard. Grazie a tutti!
Ci sono casi in cui l'utilizzo di un finale ti darà sicuramente prestazioni migliori, ad esempio usando http://en.wikipedia.org/wiki/Memoization. – Stuart
@Stuart, sei confuso. Le ottimizzazioni della Memoizzazione non sono correlate alla parola chiave 'final' (sebbene possano essere usate insieme in Java, la parola chiave' final' non fornisce alcun vantaggio di velocità inerente al pattern Memoization). – BrainSlugs83
La domanda dell'OP non ha mai avuto risposta. Un p̶a̶s̶s̶e̶d̶ ha restituito la variabile finale in Java rimane finale sull'altro lato? –