Beschwerde gegen die letzte Variable

7

Okay, soweit ich weiß, verstehe ich diese Dinge über eine final Variable.

  1. Es sollte nur einmal vergeben werden
  2. Alle Variablen final sollten initialisiert werden, bevor der Konstruktor
  3. abgeschlossen hat

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?

    
noMAD 20.11.2012, 17:02
quelle

5 Antworten

18

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 : -

%Vor%

Siehe JLS - Definite Assignments für eine detaillierte Erklärung dazu.

    
Rohit Jain 20.11.2012, 17:03
quelle
8

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 .

    
biziclop 20.11.2012 17:03
quelle
3

weil der Compiler nicht weiß, dass der einzige Aufruf von

ist %Vor%

stammt vom Konstruktor

    
Sam I am 20.11.2012 17:04
quelle
0

Sollte die folgende Zeile sein

%Vor%

etwas wie

%Vor%

Sie vermissen die Klasse.

    
Kami 20.11.2012 17:04
quelle
0

Nur eine Randnotiz:

%Vor%

Das ist wirklich ein schlechtes Design. Sie sollten keine überschreibbare Methode vom Konstruktor aufrufen.

    
Bhesh Gurung 20.11.2012 17:07
quelle

Tags und Links