388 Stimmen

Unterschied zwischen final und effektiv final

Ich spiele mit Lambdas in Java 8 und bin auf die Warnung lokale Variablen, auf die von einem Lambda-Ausdruck verwiesen wird, müssen endgültig oder effektiv endgültig sein gestoßen. Ich weiß, dass wenn ich Variablen innerhalb einer anonymen Klasse verwende, sie in der äußeren Klasse final sein müssen, aber trotzdem - was ist der Unterschied zwischen final und effektiv endgültig?

253voto

Suresh Atta Punkte 117688

... ab Java SE 8 kann eine lokale Klasse auf lokale Variablen und Parameter des umgebenden Blocks zugreifen, die final oder effektiv final sind. Ein Variable oder Parameter, dessen Wert nie geändert wird, nachdem er initialisiert wurde, ist effektiv final.

Zum Beispiel, nehmen wir an, dass die Variable numberLength nicht als final deklariert ist, und Sie die markierte Zuweisung im Konstruktor der Klasse PhoneNumber hinzufügen:

public class OutterClass {  

  int numberLength; // <== nicht *final*

  class PhoneNumber {

    PhoneNumber(String phoneNumber) {
        numberLength = 7;   // <== Zuweisung an numberLength
        String currentNumber = phoneNumber.replaceAll(
            regularExpression, "");
        if (currentNumber.length() == numberLength)
            formattedPhoneNumber = currentNumber;
        else
            formattedPhoneNumber = null;
     }

  ...

  }

...

}

Aufgrund dieser Zuweisung ist die Variable numberLength nicht mehr effektiv final. Als Folge generiert der Java-Compiler eine Fehlermeldung ähnlich wie "lokale Variablen, auf die von einer inneren Klasse zugegriffen wird, müssen final oder effektiv final sein", wenn die innere Klasse PhoneNumber versucht, auf die Variable numberLength zuzugreifen:

http://codeinventions.blogspot.in/2014/07/difference-between-final-and.html

http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html

145voto

Maurice Naftalin Punkte 10126

Ich finde, der einfachste Weg, "effektiv final" zu erklären, ist sich vorzustellen, dass man den final-Modifier zu einer Variablendeklaration hinzufügt. Wenn das Programm sich auch nach dieser Änderung sowohl zur Kompilierzeit als auch zur Laufzeit auf die gleiche Weise verhält, dann ist diese Variable effektiv final.

49voto

Eurig Jones Punkte 7690

Diese Variable unten ist final, daher können wir ihren Wert nicht ändern, sobald sie initialisiert ist. Wenn wir es versuchen, erhalten wir einen Kompilierungsfehler...

final int variable = 123;

Aber wenn wir eine Variable wie diese erstellen, können wir ihren Wert ändern...

int variable = 123;
variable = 456;

Aber in Java 8 sind alle Variablen standardmäßig final. Aber durch das Vorhandensein der 2. Zeile im Code wird sie nicht-final. Wenn wir also die 2. Zeile aus dem obigen Code entfernen, ist unsere Variable jetzt "effektiv final"...

int variable = 123;

Also.. Jede Variable, die einmal und nur einmal zugewiesen wird, ist "effektiv final".

39voto

Ajeet Ganga Punkte 7942

'Effectively final' ist eine Variable, die keinen Compilerfehler auslösen würde, wenn sie um 'final' ergänzt würde

Aus einem Artikel von 'Brian Goetz',

Informell ist eine lokale Variable effektiv final, wenn ihr Anfangswert nie geändert wird - mit anderen Worten, das Deklarieren als final würde keinen Kompilierungsfehler verursachen.

lambda-state-final- Brian Goetz

39voto

Mark Elliot Punkte 71774

Laut den Dokumenten:

Ein Variable oder Parameter, dessen Wert nie nach der Initialisierung geändert wird, ist effektiv endgültig.

Grundsätzlich wird eine Variable von dem Compiler als effektiv endgültig betrachtet, wenn diese außerhalb ihrer Initialisierung nicht in Zuweisungen vorkommt.

Beispielhaft betrachte eine Klasse:

public class Foo {

    public void baz(int bar) {
        // Während die nächste Zeile auskommentiert ist, ist bar effektiv endgültig
        // und wenn sie nicht auskommentiert ist, bedeutet die Zuweisung, dass bar nicht
        // effektiv endgültig ist.

        // bar = 2;
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X