为什么下面的代码会出现空指针异常?
object Test extends App{
trait MyTrait[A]{ self =>
val seq: Seq[A]
val size = seq.size // null pointer here
}
val p = new MyTrait[Int]{
val seq = Seq(1,2,3)
}
}
如果我将大小字段更改为惰性,那么没关系。
为什么下面的代码会出现空指针异常?
object Test extends App{
trait MyTrait[A]{ self =>
val seq: Seq[A]
val size = seq.size // null pointer here
}
val p = new MyTrait[Int]{
val seq = Seq(1,2,3)
}
}
如果我将大小字段更改为惰性,那么没关系。
字段按照它们混合的顺序进行初始化——所以首先发生特征中的所有事情,然后val
分配给Seq(1,2,3)
(因为你实际上是在混合匿名特征)。
正如您所发现的,lazy val
这通常是摆脱这种混乱的一种方法:在seq.size
您需要它之前,您实际上不会调用它,这是在您填充该seq
字段之后。
风格建议是避免 vals 的特性,有利于 defs 和惰性 vals,因为 init order 地雷。
对话示例: https ://groups.google.com/forum/?fromgroups=#!topic/scala-user/nrOrjPOYmb0