Scala,在对象初始化时访问成员

时间:2016-09-09 13:34:32

标签: scala subclass base-class

class InitializationTest {
  abstract class Base {
    method()
    def method(): Unit
  }

  class Subclass extends Base {
    val obj = new Object
    override def method(): Unit = {
      println(obj) // null
      // How to get the Object here?
    }
  }

  @Test
  def doTest(): Unit = {
    new Subclass()
  }
}

在我进行实验时,println(obj)表达式将输出null

我的问题是,如果我需要访问method Subclass中的obj。如果不将{i}从val更改为var,或者我不能做,我该怎么办?

感谢。

2 个答案:

答案 0 :(得分:3)

一种解决方案是将obj定义为lazy val

另一个是使用早期定义

class Subclass extends {
  val obj = new Object
} with Base {
  override def method(): Unit = {
    println(obj) // not null!
  }
}

可以找到这些解决方案(以及其他一些解决方案){。{3}}。

答案 1 :(得分:1)

您需要早期初始化程序

export LC_ALL="en_US.UTF-8"
export LANG="en_US.UTF-8"

您的代码告诉编译器“运行Base的构造函数,然后运行Subclass的构造函数”,导致obj的null访问。

我编写的代码告诉编译器“运行未命名的扩展,然后运行Base的构造函数,然后运行Subclass的构造函数”,因为obj在未命名的扩展中初始化,它在Base获取之前首先应用有机会访问它。