2013-06-03 31 views
1

我想學習斯卡拉,並認爲我會開始閱讀「斯卡拉不耐煩」。斯卡拉 - 建設秩序和早期定義語法

class Animal { 
    val range: Int = 10 
    val env: Array[Int] = new Array[Int](range) 

} 

class Ant extends Animal { 
    override val range: Int = 2 
} 

,然後他解釋了爲什麼env最終被一個空數組[INT]並進行解釋的方法來防止這種情況,包括早期的定義:在那裏,他用下面的類引用建設秩序問題句法。

但是......我不能阻止只是這樣做:

class Animal(val range: Int = 10) { 
    val env: Array[Int] = new Array[Int](range) 
    /* do animal stuff */ 
} 

class Ant(override val range: Int = 2) extends Animal(range) { 
    /* do ant stuff */ 
} 

???爲什麼早期定義語法真的有必要?

+2

如果'Animal'類在其他一些沒有控制權的庫中發生了什麼? – tiran

+0

哼哼......這是一個問題。 :( –

回答

4

我認爲更好的方式來看待早期實例化的需求來自混合性狀。有了特質,你就不會有一個可以調整的構造函數來解決這類問題。考慮這一點很瑣碎,完全不現實的例子:

trait Foo{ 
    val bar:String 
    val barLength = bar.length() 
} 

object MyFoo extends Foo{ 
    val bar = "test" 
} 

因爲它現在代表,該代碼將拋出一個NullPointerException在創建MyFoo因爲bar還不會在調用bar.length()定義。但是,如果你使用的早期初始化,並重新定義MyFoo爲:

object MyFoo extends {val bar = "test"} with Foo{ 

} 

然後一切工作就好了。

+0

嗡嗡聲!現在更有意義了,謝謝。 –