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关键字,它可以让成员在第一次使用时被初始化。 […]