2013-02-01 15 views
6

Eventuali duplicati:
Java final modifieruso corretto di finale

Questa è solo una piccola domanda sulle preferenze. Quale sarebbe l'uso corretto per il modificatore finale?

Ho notato che passando da sorgente a fonte tendono a usarlo più di altri. Lo metto per i parametri di un metodo, per le variabili nel metodo e per quello che posso. È necessario o sto semplicemente esagerando?

Riferimento:

private final int x; 
private final int y; 
private final int id; 
private final int width; 
private final int height; 

public Widget(final int id, final int x, final int y, final int width, final int height) { 
    this.id = id; 
    this.x = x; 
    this.y = y; 
    this.xmod = x; 
    this.ymod = y; 
    this.width = width; 
    this.height = height; 
} 
+4

[Modificatore finale Java] (http://stackoverflow.com/questions/4012167/java-final-modifier) ​​ – Smit

+0

Puoi condividere alcuni esempi? –

+0

Penso che dovresti usare 'final' solo quando è necessario. Come qualsiasi cosa, non dovresti abusarne. –

risposta

5

Sì, si sta esagerando. Storicamente, questo potrebbe aver portato ad alcune ottimizzazioni - ad es. i metodi finali possono essere più facilmente delineati, ma in questi giorni la maggior parte di queste ottimizzazioni viene eseguita indipendentemente dal fatto che il metodo sia effettivamente o meno definitivo.

I luoghi che dovresti ancora usare finale sono sulla maggior parte dei campi in classi, su classi che non dovrebbero essere, o non sono, estese, su metodi che non vuoi sovrascrivere, e su variabili locali che devono ottenere referenziato in classi interne anonime.

In particolare, è eccessivo farlo su variabili locali e sui parametri del metodo che non verranno incapsulati in classi interne anonime.

+2

+1 Sono d'accordo sul fatto che un uso eccessivo contribuisca a ingombrare, specialmente sui parametri del metodo e sulle variabili locali. Anche 'final' in generale non ha implicazioni di runtime http://www.ibm.com/developerworks/java/library/j-jtp1029/index.html –

+0

Il downvoter dovrebbe spiegare? –

+1

A qualcuno probabilmente piace la confusione finale. Conosco persone che mettono la finale su tutte le variabili. –

2

direi che qualsiasi campo, classe o un metodo che non sarà mai modificato o sovrascritto dovrebbero sempre essere definitiva. Questo lo rende thread-safe e consente al compilatore e alla vm di fare ottimizzazioni. Chiarifica anche il tuo intento come programmatore e dice ad altri sviluppatori che il valore non cambia mai, quindi se cercano la complessità possono guardare altrove.

Buon articolo qui: http://www.javapractices.com/topic/TopicAction.do?Id=23

1

direi che si dovrebbe usare "finale" ogni volta che non si vuole una variabile di essere cambiato dopo che è stato inizializzato o se non si vuole una classe fatevi sottoclasse o un metodo da sovrascrivere ma sottoclassi. Per quanto riguarda l'ottimizzazione del compilatore, ho pensato che l'uso di parole chiave "finale" avrebbe aiutato in qualche modo, ma ho appena letto questo:

Un errore comune è che la dichiarazione di una classe o di un metodo finale migliora l'efficienza, consentendo al compilatore per inserire direttamente il metodo in linea ovunque venga chiamato. In effetti il ​​compilatore non è in grado di eseguire perché il metodo viene caricato in fase di runtime e potrebbe non essere la versione uguale a quella appena compilata. Solo l'ambiente di esecuzione e il compilatore JIT hanno le informazioni su esattamente quali classi sono state caricate e sono in grado di prendere decisioni migliori su quando in linea, indipendentemente dal fatto che il metodo sia definitivo.

http://en.wikipedia.org/wiki/Final_(Java)

0

Non è necessario rendere variabili definitive ogni volta. Potrebbe diventare un mal di testa quando si desidera modificare il valore di tali variabili.

Penso che dovresti decalificare una variabile finale solo se è costante in modo univoco o quando pensi che non debba essere modificata.

1

Se Java è progettato oggi, tutte le variabili locali e i parametri del metodo saranno definitivi per impostazione predefinita.

Sfortunatamente, poiché il linguaggio non lo fa, dovremmo farlo manualmente invece?

Sembra troppo complicato. Se non lo facciamo, e non sembra esserci un problema enorme, allora possiamo essere pigri e non farlo.