2013-06-03 33 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

嗡嗡声!现在更有意义了,谢谢。 –