【问题标题】:Scala, accessing members when the object is initializingScala,在对象初始化时访问成员
【发布时间】:2017-01-17 16:16:15
【问题描述】:
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

我的问题是,如果我需要访问methodSubclass 中的obj。不把obj从val改成var怎么办,不然不行?

谢谢。

【问题讨论】:

  • 在不知道以这种方式调用method 的原因的情况下,直接的解决方法是将val 声明为lazy

标签: scala subclass base-class


【解决方案1】:

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

另一个正在使用早期定义

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

可以在here 找到这些解决方案(以及其他一些解决方案)。

【讨论】:

    【解决方案2】:

    你需要一个早期的初始化器

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多