2010-07-17 16 views
6

Eventuali duplicati:
When to use finaloggetto finale in java

Qual è l'uso di dichiarare final parola chiave per gli oggetti? Ad esempio:

final Object obj = new myclass(); 
+2

Vedere [Quando utilizzare finale] (http://stackoverflow.com/questions/154314/when-to-use-final) –

risposta

21

L'utilizzo della parola chiave "final" rende immutabile la variabile che si sta dichiarando. Una volta assegnato inizialmente, non può essere riassegnato.

Tuttavia, questo non significa necessariamente che lo stato dell'istanza cui si riferisce la variabile è immutabile, solo il riferimento stesso.

Esistono diversi motivi per cui si utilizza la parola chiave "finale" sulle variabili. Uno è l'ottimizzazione dove dichiarando una variabile come finale consente al valore di essere memoized.

Un altro scenario in cui si utilizzerà una variabile finale è quando una classe interna all'interno di un metodo deve accedere a una variabile nel metodo di dichiarazione. Il codice seguente illustra questo:

public void foo() { 

     final int x = 1; 

     new Runnable() { 


      @Override 
      public void run() { 
       int i = x; 
      } 

     }; 

} 

Se x non è dichiarato come "finale" il codice si tradurrà in un errore di compilazione. La ragione esatta per cui è necessario essere "final" è perché la nuova istanza di classe può sopravvivere all'invocazione del metodo e quindi ha bisogno della propria istanza di x. Per evitare di avere più copie di una variabile mutabile all'interno dello stesso ambito, la variabile deve essere dichiarata finale in modo che non possa essere modificata.

Alcuni programmatori sostengono anche l'uso di "final" per evitare di riassegnare le variabili accidentalmente dove non dovrebbero essere. Una sorta di regola di tipo "best practice".

3

Dichiara una variabile che non può essere modificata una volta inizializzata. Una sorta di readonly.

6

Le variabili finali non possono essere riassegnate. Se sono di classe o ambito di istanza, devono essere assegnati quando viene creato un oggetto. Un uso: costanti che non vuoi che qualcun altro usi il tuo per cambiare, ad es. string o int constanti (anche se le enumerazioni lo fanno meglio in 1.5+). Inoltre, se vuoi fare riferimento a una variabile metodo-scope da un metodo anonimo che definisci all'interno di quel metodo, deve essere finale, quindi Java non deve occuparsi di cosa succederebbe se il tuo codice riassegnasse quella variabile più tardi, dopo averlo creato lo stack frame/scope locale per il metodo anonimo interno. Si parla di includere qualche forma di chiusura in Java 7 che potrebbe evitare questa restrizione.

Forse ho sbagliato la terminologia un po '- scusa! ma questa è l'idea generale.

6

Un altro uso finale per evitare accidentalmente cambiarla:

public String foo(int a) { 
    final String s; 
    switch(a) { 
    case 0: 
    s="zero"; 
    break; 
    case 1: 
    s="one"; 
    //forgot break; 
    default: 
    s="some number"; 
    } 
    return s; 
} 

Questo non verrà compilato dal momento che se a == 1, s verrebbe assegnato due volte, a causa della rottura mancante. La finale può essere di aiuto in cattive dichiarazioni di switch.

Problemi correlati