2012-10-19 14 views
6

Kann ich Argumente an Scala-Klassenkonstruktor übergeben, die nicht in der Klasse selbst gespeichert werden? Ich möchte Funktionalität erreichen, die in Java geschrieben werden könnte wie folgt:Scala-Klasse Konstruktor lokale Parameter

class A { 
    private final SomethingElse y; 
    public A(Something x) { 
      y = x.derive(this); 
    } 
} 

D.h. Der Klassenkonstruktor nimmt Parameter, die später in einen anderen Wert umgewandelt werden, indem er auf this verweist. Der Parameter wird vergessen, nachdem der Konstruktor zurückgegeben wurde.

In Scala kann ich tun:

class A(x: Something) { 
    val y = x.derive(this) 
} 

Aber es bedeutet, dass x in der Klasse gespeichert, die ich vermeiden will. Seit x.derive Methode verwendet Verweis auf this, kann ich die Transformation in Companion-Objekt nicht vornehmen.

Antwort

7

Aber es bedeutet, dass x in der Klasse gespeichert ist, die ich vermeiden möchte.

Wenn Sie das Konstruktorargument nirgendwo mit Ausnahme des Konstruktors selbst referenzieren, wird das Feld nicht erstellt. Wenn Sie sich auf x beziehen, z.B. In toString() erstellt Scala automatisch das private val für Sie.

Verwenden Sie javap -c -private A, um zu überprüfen, welche Art von Feldern tatsächlich erstellt werden.

BTW übergeben Sie this innerhalb eines Konstruktors, was bedeutet, erhält einen Verweis auf möglicherweise nicht initialisierte Instanz von A. Achtung!

Verwandte Themen