2010-07-17 34 views
6

Mögliche Duplizieren:
When to use finalletztes Objekt in Java

Was ist die Verwendung final Schlüsselwort für Objekte zu erklären? Beispiel:

+2

Siehe [Wann Endgültig zu verwenden] (http://stackoverflow.com/questions/154314/when-to-use-final) –

Antwort

21

Mit dem Schlüsselwort "final" wird die Variable, die Sie deklarieren, unveränderlich. Sobald es anfänglich zugewiesen wurde, kann es nicht neu zugewiesen werden.

Dies bedeutet jedoch nicht notwendigerweise, dass der Status der Instanz, auf die sich die Variable bezieht, unveränderlich ist, sondern nur die Referenz selbst.

Es gibt mehrere Gründe, warum Sie das Schlüsselwort "final" für Variablen verwenden würden. Eine ist die Optimierung, bei der durch Deklarieren einer Variablen als final der Wert memoized wird.

Ein anderes Szenario, in dem Sie eine letzte Variable verwenden würden, ist, wenn eine innere Klasse innerhalb einer Methode auf eine Variable in der deklarierenden Methode zugreifen muss. Der folgende Code veranschaulicht dies:

public void foo() { 

     final int x = 1; 

     new Runnable() { 


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

     }; 

} 

Wenn x nicht deklariert wird als „endgültig“ der Code in einem Übersetzungsfehler führen. Der genaue Grund dafür, dass "final" sein muss, liegt darin, dass die neue Klasseninstanz den Methodenaufruf überleben kann und daher eine eigene Instanz von x benötigt. Um zu vermeiden, dass mehrere Kopien einer veränderbaren Variablen im selben Gültigkeitsbereich vorhanden sind, muss die Variable als endgültig definiert werden, damit sie nicht geändert werden kann.

Einige Programmierer befürworten auch die Verwendung von "final", um zu verhindern, dass Variablen zufällig neu zugeordnet werden, wo sie nicht sein sollten. Eine Art "Best Practice" -Regel.

3

Er deklariert eine Variable, die nach der Initialisierung nicht mehr geändert werden kann. Art von readonly.

6

Endgültige Variablen können nicht neu zugewiesen werden. Wenn sie Klassen- oder Instanzbereich sind, müssen sie zugewiesen werden, wenn ein Objekt erstellt wird. Eine Verwendung: Konstanten, die nicht von anderen Personen geändert werden sollen, z. String- oder Int-Konstanten (obwohl Enums dies in 1.5+ besser machen). Wenn Sie eine Methode-Bereichsvariable aus einer anonymen Methode referenzieren möchten, die Sie in dieser Methode definieren, muss sie endgültig sein. Daher muss sich Java nicht damit befassen, was passieren würde, wenn Ihr Code diese Variable später neu zuweisen würde der lokale Stack-Frame/Bereich für die interne anonyme Methode. Es ist die Rede davon, in Java 7 eine Form der Sperrung einzuführen, die diese Einschränkung vermeiden könnte.

Ich habe die Terminologie ein wenig verpfuscht - sorry! aber das ist die allgemeine Idee.

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; 
} 

Dies wird da nicht kompiliert werden, wenn a == 1, s doppelt vergeben werden würde, wegen der fehlenden Pause:

6

Eine weitere Verwendung der endgültigen versehentlich Wechsel zu verhindern. Final kann in fiesen Switch-Anweisungen helfen.