1

我正在尝试学习 Scala,并认为我会从阅读“不耐烦的 Scala”开始。在那里,他通过使用以下类引用了构造顺序问题:

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

}

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

然后他解释了为什么env最终是一个空的 Array[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 */
}

???为什么早期定义语法真的很有必要?

4

1 回答 1

5

我认为了解早期实例化需求的更好方法是混合特征。使用特征,您将没有可以调整的构造函数来解决此类问题。考虑这个非常微不足道且完全不​​切实际的例子:

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

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

就目前而言,此代码将NullPointerException在创建 MyFoo 时抛出 a,因为bar在调用时尚未定义bar.length()。但是如果你使用早期初始化,并重新定义MyFoo为:

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

}

然后一切正常。

于 2013-06-03T13:33:52.067 回答