Frage

Was ist eine endgültige Variable in Java? Zum Beispiel: Wenn ich schreibe final int temp; In der Funktion was bedeutet das endgültige Schlüsselwort?
Wann möchte ich die endgültige Variable (sowohl als Klassenvariable als auch als Funktionsvariable) verwenden?
Warum müssen Variablen in einem synchronisierten Block endgültig deklariert werden?

War es hilfreich?

Lösung

Grundsätzlich bedeutet es nur, dass Sie den Wert nicht ändern können. Zum Beispiel Variablen müssen Sie endgültige Variablen einmal (und nur einmal) im Konstruktor (oder mit einem variablen Initialisierer) zuweisen. Die Synchronisation ist ein ziemlich orthogonales Konzept.

Der Hauptgrund für die Herstellung von a lokal Variable Final ist so, dass Sie es in einer anonymen inneren Klasse verwenden können. Dies hat nichts damit zu tun, in einem synchronisierten Block zu sein.

Endgültige Variablen sind Zugegebenermaßen nützlich für unveränderliche Klassen - und die Unveränderlichkeit erleichtert das Leben in einer Umgebung mit mehreren Threaden - aber das ist die einzige Beziehung zwischen den beiden, die ich mir vorstellen kann ...

Bearbeiten: Der Kommentar von Wildwezyr ist sinnvoll, die Variable nicht zu ändern Auf welcher Synchronisierung. Das wäre gefährlich, aus den Gründen, die er gegeben hat. Haben Sie das mit "Variablen im synchronisierten Block" gemeint?

Andere Tipps

Die endgültigen Variablen und synchronisierten Codeblöcke haben etwas gemeinsam ... wenn Sie nicht-Finale-Variable deklarieren a und dann schreiben synchronized (a) { System.out.println('xxx'); } Zumindest in NetBeans erhalten Sie eine Warnung "Synchronisation auf Nicht -Finalfeld".

Warum sollten Sie nicht auf Nicht-Finalfeld synchronisieren? Da sich der Feldwert ändern kann, können verschiedene Threads an verschiedenen Objekten synchronisieren (verschiedene Werte des Feldes) - daher kann es überhaupt keine Synchronisation geben (jeder Thread kann gleichzeitig einen synchronisierten Block eingeben).

Schauen Sie sich hier zum Beispiel von realen Problemen an, die durch Synchronisieren auf Nicht-Finalfeld verursacht werden: http://forums.sun.com/thread.jspa?threadid=5379204

Zusätzlich zu dem, was Jon Skeet gesagt hat, kann der Wert nicht geändert werden, aber der Inhalt kann geändert werden.

final Integer one = new Integer(1);
...
one = new Integer(2); // compile error

final List list = new ArrayList();
...
list = new ArrayList(); // compile error
list.add(1); // Changes list, but that's fine!

Beachten Sie auch, dass das letzte und statische Finale nicht gleich ist. Das Finale liegt im Rahmen der Instanz, während statisches Finale für alle Fälle einer Klasse gleich ist (in anderen Sprachen könnte dies als Konstante bezeichnet werden).

Persönlich denke ich, dass der Vorteil des Finale, auch wenn es nicht unbedingt erforderlich ist, um Ihre Software zum Laufen zu bringen, in der semantischen Bedeutung ist. Es bietet Ihnen die Möglichkeit, dem Compiler zu sagen und die nächste Person, die an diesem Code arbeitet Dass diese Variable nicht geändert werden soll und dass der Versuch, sie zu ändern, zu einem Fehler führen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top