Okay, soweit ich weiß, verstehe ich diese Dinge über eine final
Variable.
final
sollten initialisiert werden, bevor der Konstruktor Wenn ich nun das obige benutze, verstehe ich nicht, wie das Folgende nicht funktioniert:
%Vor% Hier, bevor der Konstruktor fertig ist, werden die final
Variablen gesetzt. Warum also klagen die Compiler dagegen?
Es ist nicht notwendig, dass Ihre Methode nur vom Konstruktor aufgerufen wird, sie kann auch von außerhalb des Konstruktors aufgerufen werden. Und sogar ein zweiter Aufruf könnte zu demselben Konstruktor in Zukunft hinzugefügt werden.
Auch wenn Sie es jetzt vielleicht nicht benutzt haben, aber Compiler kann sich nicht sicher sein, so dass es nicht erlaubt ist. Im Fachausdruck gibt es keine definite assignment
.
Beispiel: - Angenommen, Sie instanziieren Ihre Klasse aus main
: -
Siehe JLS - Definite Assignments für eine detaillierte Erklärung dazu.
Weil dich niemand daran hindert, später im Leben des Objekts setStuff()
ein zweites Mal aufzurufen, was illegal wäre.
final
Felder können nur in Codebausteinen zugewiesen werden, die garantiert nur einmal ausgeführt werden, dh Konstruktoren und Instanzinitialisierer. (Oder ein statischer Initialisierer im Falle eines static final
-Feldes.)
Mehr dazu finden Sie in der JLS .
Nur eine Randnotiz:
%Vor%Das ist wirklich ein schlechtes Design. Sie sollten keine überschreibbare Methode vom Konstruktor aufrufen.