2010-02-10 12 views
8

Perché le persone sono così enfatiche nel rendere ogni variabile all'interno di una classe "finale"? Non credo che ci sia alcun vero beneficio nell'aggiungere variabili locali definitive a quelle private, o in realtà usare finale per qualcosa di diverso dalle costanti e dalle variabili passanti nelle classi interne anonime.L'uso eccessivo del danno finale è più che positivo?

Non sto cercando di iniziare una sorta di guerra delle fiamme, voglio solo sinceramente sapere perché questo è così importante per alcune persone. Mi sto perdendo qualcosa?

+6

"Usa finale liberamente" - http://www.javapractices.com/topic/TopicAction.do?Id=23 – Nate

+1

Hai risposte che indicano i vantaggi, voglio chiedere dove pensi che potrebbe fare male ? – Thilo

+1

Che cos'è una "variabile locale privata"? Intendi un campo privato o una variabile locale? Le persone possono avere opinioni diverse sui due casi e la tua domanda non chiarisce di che cosa stai parlando, o se intendi entrambi. –

risposta

14
  1. Intenzione. Altre persone che modificano il tuo codice non cambieranno i valori che non dovrebbero cambiare.

  2. Le ottimizzazioni del compilatore possono essere eseguite se il compilatore sa che il valore di un campo non cambierà mai.

Inoltre, se tutte le variabili in una classe è definitiva (come si fa riferimento al tuo post), allora si ha una classe immutabile (finché non esporre riferimenti a proprietà mutevoli) che è un ottimo modo per raggiungere la sicurezza del filo.

+0

Aiuta davvero le ottimizzazioni? Se una variabile non viene modificata dopo l'inizializzazione, il compilatore determinerà se la variabile è contrassegnata o meno come finale. –

+0

Sì, Michael, ho sentito anche questo. Dove l'hai imparato? Non riesco a trovare alcun documento che rompa queste ottimizzazioni del compilatore. –

+0

Se aggiungi la finale a tutte le variabili, anche le variabili di metodo locali, perché ritieni che il riferimento a cui punta la variabile non debba essere sovrascritto, non è un po 'troppo protettivo? I programmatori cattivi faranno cose cattive, i bravi programmatori fanno cose buone. Non c'è nulla che impedisca a un programmatore malvagio di essere stupido e sovrascrive un riferimento a un oggetto. L'uso eccessivo del "finale" non la ferma, anzi, probabilmente intorpidisce le persone alla reale importanza dell'uso finale. Questo è il mio punto, immagino. –

4

Segnala che non mi aspetto che quel valore cambi, che è documentazione gratuita. La pratica è perché è chiaramente comunica l'intento di quella variabile e costringe il compilatore a verificarlo. Oltre a ciò, consente al compilatore di fare ottimizzazioni.

+0

Vuoi dire che non ti aspetti che il riferimento della variabile cambi? Sono queste classi private o variabili locali? –

+2

Qualcosa - quando qualcuno sta leggendo il codice, può vedere che il valore (o riferimento) che sto assegnando su quella linea è quello che sto assegnando su quella linea per la durata dell'ambito. Per quanto riguarda la definizione dei campi membro della classe 'final', obbliga queste variabili a essere impostate in ogni costruttore, che è una buona protezione contro gli errori logici. –

+0

Sì, sto bene con l'utilizzo di final per rendere una classe immutabile. Una bella caratteristica in realtà. Quello che ho difficoltà è quando qualcuno usa le variabili finali all'interno di un metodo. private BigDecimal myMethod (finale BigDecimal money) { final Calc myCalc = new MyCalc(); return calc.doubleMyMoney (denaro); } Non vedo la necessità di rendere finale MyCalc. Questo aiuta davvero la raccolta dei rifiuti? Rende il codice più performante? –

0

Penso che l'uso di valori finali rispetto a quelli interni a una classe sia eccessivo, a meno che la classe non sia probabilmente ereditata. L'unico vantaggio è attorno alle ottimizzazioni del compilatore, che sicuramente potrebbero avvantaggiarsene.

+1

Quando dici "overkill", cosa intendi? Cioè, cos'è troppo? Le persone – danben

+0

menzionano le ottimizzazioni del compilatore, ma ho sentito che con i recenti progressi nel compilatore, che la parola chiave finale non aiuta l'ottimizzatore. Non sono stato in grado di trovare la documentazione ufficiale su questo, quindi non sono sicuro di dove la gente stia prendendo questa diceria. –

+0

Ogni singola variabile di classe (che rende una classe immutabile) e ogni variabile locale all'interno dei metodi. Così molte delle righe di codice di una classe iniziano con "finale". Trovo questo molto difficile da leggere e sto lottando con i benefici. –

3

È importante perché l'immutabilità è importante in particolare quando si ha a che fare con un modello di memoria condivisa. Se qualcosa è immutabile allora è thread-safe, questo rende abbastanza buono un argomento da seguire come best practice.

http://www.artima.com/intv/blochP.html

+1

Sì, ma è irrilevante per variabili e parametri locali perché sono visibili solo per il thread corrente. –

+0

A volte è necessario renderli definitivi, a volte no, dipende dalla situazione. Una best practice ha sempre delle eccezioni alla regola. – Jon

+0

Le classi interne anonime sono l'unica volta in cui è necessario renderle definitive. – Robin

2

un progetto che sto attualmente lavorando su è configurato in modo che ogni volta che si preme "salva" in Eclipse, il modificatore final viene aggiunto a ogni variabile o un campo che non è cambiato nel codice. E non ha ancora ferito nessuno.

+0

@Bozho: Eclipse fa questo di default o hai bisogno di qualche plugin? Sai se c'è qualcosa di simile per IntelliJ IDEA? – SyntaxT3rr0r

+0

@WizardOfOdds: no, è un generatore di formiche, che a sua volta chiama un'attività personalizzata della piattaforma eCommerce che stiamo utilizzando. – Bozho

2

Un beneficio per la programmazione concorrente che non è stata ancora citato:

campi finale sono garantiti per essere inizializzato quando l'esecuzione del costruttore viene completata.

+0

Questo è un punto CRUCIAL. Non riesco a revocare abbastanza. –

1

Ci sono molti buoni motivi per utilizzare il finale, come indicato altrove. Un posto dove non ne vale la pena, IMO, è sui parametri di un metodo. A rigor di termini, la parola chiave aggiunge valore qui, ma il valore non è abbastanza alto da sopportare la brutta sintassi. Preferirei esprimere questo tipo di informazioni attraverso i test unitari.

7

Il rovescio della medaglia, è che

annoy it is hard 
annoy to read 
annoy code or anything 
annoy else when it all 
annoy starts in the 
annoy same way 

Altro che l'utilizzo ovvia per la creazione di costanti e prevenire la creazione di sottoclassi/imperativa, è una preferenza personale nella maggior parte dei casi dal momento che molti credono che i benefici di "mostrare intenti programmatore" sono superato dalla leggibilità del codice reale. Molti preferiscono un po 'meno verbosità.

Per quanto riguarda le ottimizzazioni, si tratta di una scarsità di utilizzo (meaningless in many cases). È la peggiore forma di micro ottimizzazione e ai tempi di JIT non ha alcuno scopo.

Suggerirei di usarlo se preferisci, non farlo se è quello che preferisci. Dal momento che in molti casi si tratterà di argomenti religiosi, non preoccuparti.

Problemi correlati