2010-02-19 14 views
6

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!

risposta

3

Alcune persone potrebbero dirti che c'è un vantaggio in termini di prestazioni nell'utilizzo finale, ma in nessun modo, in definitiva, dimostrato.

Il vantaggio principale della parola chiave final è che il programmatore indichi che una classe, un metodo o un campo non devono essere modificati.

Tenere presente che dichiarare una variabile final non rende immutabile l'oggetto di riferimento. Significa solo che la variabile non può avere il suo valore riassegnato. È ancora possibile eseguire i metodi della variabile file che potrebbe modificare internamente l'oggetto File.

Nei due metodi forniti, non vedo alcun valore nel rendere la variabile filefinal. Alcune convenzioni sul codice sostengono di rendere tutte le variabili final a meno che non sia necessario modificarle. Alcune persone non si iscrivono a questo. Lo considero una variazione sul precautionary principle.

+0

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

+0

@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

+0

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? –

13

final in questo caso significa solo che il riferimento locale file sarà immutabile. Non ha significato al di fuori del metodo. Alcune convenzioni di codifica sostengono di avere tutte le variabili finali a meno che non debbano essere modificabili, così vedrai un codice del genere quando qualcuno sta seguendo tali linee guida.

+3

So che questo è il pignolo ... ma volevo solo dire che "immutabile" potrebbe non essere la scelta migliore per le parole, poiché tutte le stringhe sono immutabili in Java. Riconosco il tuo punto, comunque, a prescindere da – froadie

+5

, ho detto che il file _reference_ era immutabile. Cioè non è possibile puntare il "file" su un altro oggetto "File". Questo è esattamente ciò che la parola chiave "finale" significa in Java. Il riferimento non può essere cambiato. La parola immutabile significa solo qualcosa che non può essere cambiato. Può essere utilizzato in molti contesti. – Kris

Problemi correlati