2012-04-02 18 views
5

Eventuali duplicati:
When should one use final?Devo usare il modificatore "finale" quando creo oggetti Data?

Quando i programmatori Java devono preferire l'uso

final Date now = new Date(); 

oltre

Date now = new Date(); 
+0

Dipende da come si desidera utilizzarlo. Nella maggior parte dei casi, davvero non penso che importi. – AedonEtLIRA

+1

D'accordo con aix - non c'è niente riguardo l'uso di 'final' che è specifico per le variabili di' Date'. –

+0

Ho chiesto non così chiaramente cosa mi interessava ...Questo http://stackoverflow.com/questions/266806/is-there-any-performance-reason-to-declare-method-parameters-final-in-java è ciò che volevo ... – Zango

risposta

7

Oltre a decidere se una variabile deve essere definitiva o meno che è coperta in altri post, penso che il problema con final Date now = ..., sia che sebbene il riferimento a ora non cambierà (è definitivo), il suo valore potrebbe. Quindi trovo questo un po 'fuorviante per gli sviluppatori che non sanno che Data è mutabile. Per esempio, si potrebbe scrivere:

public static void main(String[] args) { 
    final Date now = new Date(); 
    System.out.println(now); 
    now.setHours(5); 
    System.out.println(now); 
} 

e ottenere 2 date differenti dalla data finale ...

Ora, questo è vero per qualsiasi variabile mutabile (il contenuto di final List<String> l può cambiare troppo), ma penso che nel caso di un appuntamento, sia fin troppo facile assumere l'immutabilità.

Una soluzione migliore sarebbe utilizzando la libreria di tempo joda:

final DateTime now = new DateTime(); 

in questo caso, now è immutabile e non cambierà (& valore di riferimento).

+0

Questi metodi setter sono deprecati, ma hai ragione, possono essere chiamati. La tua è l'unica risposta corretta che ho visto finora. 1 + –

2

Quando si utilizza la parola chiave final non è possibile modificare il valore della variabile. Si applica per la data.

3

In Java, una variabile final è una variabile il cui valore, una volta assegnato, non può essere modificato. Si dichiara una variabile final quando a tale variabile verrà assegnato un valore e non sarà mai necessario modificare tale valore.

+1

La domanda è quale sarebbe il vantaggio, non ciò che fa l'ultimo. – TheBlastOne

1

Una variabile finale può essere inizializzata esplicitamente una sola volta. Una variabile di riferimento dichiarata finale non può mai essere riassegnata per fare riferimento a un oggetto diverso.

Tuttavia i dati all'interno dell'oggetto possono essere modificati. Quindi lo stato dell'oggetto può essere cambiato ma non il riferimento.

Con le variabili, il modificatore finale viene spesso utilizzato con statico per rendere la costante una variabile di classe. Esempio:

class Test{ 
    final int value=10; 
    // The following are examples of declaring constants: 
    public static final int BOXWIDTH = 6; 
    static final String TITLE = "Manager"; 

    public void changeValue(){ 
    value = 12; //will give an error 
    } 
} 

se la vostra esigenza è di questo tipo di quanto si può usare finale con la data.

+0

+1 per i primi 2 paragrafi :). –

1

Se si dichiara un campo, che è di sola lettura e si desidera avere una classe thread-safe, è necessario utilizzare il modificatore final. A volte sei costretto a fare una variabile finale, se è usata in una classe anonima. In tutti gli altri casi non ha molta importanza.