本站内容版权属于本人。转载须告知本人,写明出处,并在文首提供指向本站对应文章的链接。
本文链接:Scala对象初始化时访问成员的坑
本文链接:Scala对象初始化时访问成员的坑
先看如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class InitializationTest { abstract class Base { method() def method(): Unit } class Subclass extends Base { val obj = new Object override def method(): Unit = { println(obj) } } @Test def doTest(): Unit = { new Subclass() } } |
以doTest
为入口,这个程序的输出是:
null
和期望不一样啊!
原因是Scala以整个类中的内容为构造方法,执行顺序是从基类到子类。运行method
时,obj
还没有初始化,于是就返回了null
。
因为obj
不可变,所以这里也不能直接初始化。真正的解决方法是使用lazy
关键字,它可以让成员在第一次使用时被初始化。话说在这个情况下,比不加lazy
还要勤快啊。
于是改写成这样就正常了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class InitializationTest { abstract class Base { method() def method(): Unit } class Subclass extends Base { lazy val obj = new Object override def method(): Unit = { println(obj) } } @Test def doTest(): Unit = { new Subclass() } } |