2010-05-22 56 views
2

我有一些看起來像這樣的類:帶有非實例變量助理的構造函數?

class Foo(val:BasicData) extends Bar(val) { 
    val helper = new Helper(val) 
    val derived1 = helper.getDerived1Value() 
    val derived2 = helper.getDerived2Value() 
} 

......只是我不想守住「助手」超越構造結束的一個實例。在Java中,我會這樣做:

public class Foo { 
    final Derived derived1, derived2; 
    public Foo(BasicData val) { 
    super(val); 
    Helper helper = new Helper(val); 
    derived1 = helper.getDerived1Value(); 
    derived2 = helper.getDerived2Value(); 
    } 
} 

那麼我該如何在Scala中做類似的事情呢?我知道用apply方法創建一個與該類同名的助手對象:我希望稍微簡潔一些。

回答

4

最好看看javap的輸出(包括私有成員)你的結論在此之前已經向旁邊跨步任何用於中間模式匹配的Tuple2的字段。

由於斯卡拉2.8.0.RC2,這Scala代碼(躍然紙上編譯):

class BasicData 
{ 
    def basic1: Int = 23 
    def basic2: String = "boo!" 
} 

class Helper(v: BasicData) 
{ 
    def derived1: Int = v.basic1 + 19 
    def derived2: String = v.basic2 * 2 
} 

class Bar(val v: BasicData) 

class Foo(v: BasicData) 
extends Bar(v) 
{ 
    val (derived1, derived2) = { 
    val helper = new Helper(v) 
    (helper.derived1, helper.derived2) 
    } 
} 

產生以下Foo類:

% javap -private Foo 
public class Foo extends Bar implements scala.ScalaObject{ 
    private final scala.Tuple2 x$1; 
    private final int derived1; 
    private final java.lang.String derived2; 
    public int derived1(); 
    public java.lang.String derived2(); 
    public Foo(BasicData); 
} 
+0

實際上,看起來像一個錯誤。 – 2010-05-22 22:33:46

+0

上一個問題的討論:http://scala-programming-language.1934581.n4.nabble.com/Temporary-Values-in-Constructors-Retained-As-Fields-td1946886.html#a1946886 – retronym 2010-05-23 21:46:31

+0

Odersky:「應該是一種優化,將只用於類初始化的私有[this]變量轉換爲構造函數局部變量。我認爲這樣做相對容易,但尚未完成。 – retronym 2010-05-23 21:47:19

5

你可以使用塊創建一個臨時的輔助VAL並返回一個元組,像這樣:

class Foo(v: BasicData) extends Bar(v) { 
    val (derived1, derived2) = { 
    val helper = new Helper(v) 
    (helper.getDerived1Value(), helper.getDerived2Value()) 
    } 
} 
+0

我認爲這是完美的,只要斯卡拉可以推斷類型的成功... – 2010-05-22 18:33:28

+0

感謝羅伯特,你可以註釋vals的類型,如果你關心他們的類型: val(x:Int,y:String)= {...} – 2010-05-22 18:55:47

+0

查看下面的注意事項。 – 2010-06-14 20:55:17