private [this] bei veränderbarem Konstruktorparameter, der zu unerwartetem Verhalten führt [duplizieren]

8

Wenn ich den folgenden Code ausführe,

%Vor%

Ich bekomme:

%Vor%

Wenn ich private[this] durch private ersetze, bekomme ich das erwartete Verhalten, d. h. die letzte Ausgabezeile wird a = 0 . Ich verwende IntelliJ 2016.1.2, Scala Plugin Version 3.0.6. Und Scala-SDK-2.11.8.

    
Stephane Bersier 16.05.2016, 14:19
quelle

2 Antworten

6

Ja, es ist ein Fehler ( SI-6165 , SI-6880 ).

Lasst uns weiter erkunden. Dies ist der dekompilierte Code für beide Fälle:

private[this] :

%Vor%

Hier sehen Sie, dass var i für das Objekt erstellt wurde und direkt im Code auf zugegriffen wird . Wir sehen, dass i A.this.i zugewiesen ist, was eine direkte Zuweisung an das Feld ist. Später wird der mutierte Wert i zugewiesen, das Methodenargument, nicht A.this.i , das Feld der Klasse A . Der tatsächliche Wert i wird beschattet.

Im Gegensatz dazu, wenn i ist private :

%Vor%

Hier sehen wir, dass i eine Getter- und Setter-Methode hat, im Gegensatz zu private[this] . Wir sehen auch, dass die Dekrementierung an A.this.i_ erfolgt, was der Setter für das Feldelement A.this.i ist.

    
Yuval Itzchakov 16.05.2016, 14:37
quelle
8

Es ist ein Fehler. Siehe SI-6880 .

private[this] in einem Konstruktor var bewirkt, dass es sich fälschlicherweise selbst überschreibt und Sie den ursprünglichen Wert anstelle des gewünschten Accessors erhalten.

    
Michael Zajac 16.05.2016 14:38
quelle

Tags und Links