2013-08-10 16 views
13

Ho un piccolo conflitto con java efficace. Da una parte incoraggia vivamente ad usare il modificatore finale. Incoraggia anche l'uso del ciclo foreach.uso finale all'interno di ogni ciclo

Tuttavia non ho visto alcun pezzo di codice da nessuna parte, che i codici di questo tipo:

for (final element e : list) { 
    // do whatever. 
} 

Se elemento non dovrebbe cambiare quindi utilizzando finale sembra essere buona. Perché non è così comune?

+1

Lo uso sempre. Altri non lo usano perché dicono che "ingombrano il codice". Questo tipo di loop è chiamato "Enhanced for-loop". – Obicere

+0

Lo uso sempre. Ma io tendo ad essere d'accordo con entrambi i campi. Se davvero non vuoi che un riferimento venga riassegnato, usa 'final', punto. Ma in realtà * fa * ingombra il codice molto. Ho visto grossi pezzi di codice scritti in un modo * buono * ma sfortunatamente sembra eccessivamente prolisso. Sfortunatamente non esiste una soluzione semplice che possa soddisfare entrambi i campi, a meno che, naturalmente, non siate pronti per passare a Scala ...;) –

risposta

5

Non viene utilizzato perché il suo "codice rumore".

La parola chiave finale deve essere utilizzata per tutti i parametri del metodo, ecc. Ecc., Ma non lo è, perché mentre è più "corretta", è meno leggibile.

0

Fondamentalmente, l'elemento sarebbe finale all'interno dell'ambito del ciclo for. Non c'è molto da guadagnare lì.

+0

È abbastanza utile nel caso di un 'Runnable', e aiuta a prevenire gli errori logici causati dalla sovrascrittura la variabile sbagliata. – chrylis

+0

in particolare nel caso in cui la variabile "finale" venga utilizzata all'interno del ciclo "for-each" come chiave per accedere a una raccolta che può essere scritta nello stesso momento in un thread diverso. –

7

Generalmente gli sviluppatori lasciano i valori predefiniti e aggiungono solo il codice quando necessario. Ad ogni modo, il codice più breve da scrivere è più semplice. Pensa a una sala conferenze e ti chiedono di alzare le mani se fai qualcosa e poi ti chiedono di alzare le mani se non lo fai, circa la metà della stanza non voterà affatto.

IMHO L'impostazione predefinita avrebbe dovuto essere definitiva e si avrebbe una parola chiave var per i valori che possono essere modificati. In questo modo molti più campi sarebbero definitivi.

In questo caso particolare, non definisco le variabili locali finali sulla base del fatto che i metodi dovrebbero essere abbastanza brevi da poter determinare se la variabile è stata modificata o meno. Se non riesci a risolvere facilmente questo problema, il tuo ciclo/metodo è troppo complicato.

Per i campi, tuttavia, è consigliabile effettuare queste ultime quando possibile, specialmente se non sono private, in quanto non è facile leggere tutto il codice in cui potrebbe essere utilizzato.

2

Ci sono molti posti in cui è possibile, alcuni dicono, posizionare la parola chiave finale. Un esempio comune sono i parametri del metodo. Guardate questo snippet di codice:

public static long pow_mod(final long base, final long exponent, final long mod) { 
    // body 
} 

C'è un'altra convenzione di rompere le righe di codice dopo 80 caratteri. Questa dichiarazione non è ancora rientrata (deve essere all'interno di una classe) ed è già più lunga di quella cifra. Java è un linguaggio molto prolisso, non c'è bisogno di ingombrare il tuo codice ancora di più; soprattutto perché non c'è nulla da guadagnare rendendo definitive le variabili locali.