Kotlin - 是否可以在类中的init块之前初始化伴随对象?

时间:2016-10-31 11:21:05

标签: oop static kotlin companion-object static-initializer

是否可以在Kotlin类的companion object块之前初始化init?如果是这样,怎么样?如果没有,有没有办法完成同样的事情。

我有以下情况,

class A(val iname: String) {
  init {
    foo.add(this)
  }

  companion object B {
    @JvmField val STATIC = A("hi")
    @JvmField val foo = mutableListOf<A>()   
  }

  fun printAllStatics() {
    for (a in foo) {
      print(a.iname)
    }
  }
}

并且调用printAllStatics会导致空指针异常。

2 个答案:

答案 0 :(得分:9)

属性初始值设定项和init块的执行顺序与它们放置在类/对象体中的顺序完全相同。这是一个例子:

companion object B {
    init {
        print("1 ")
    }

    @JvmField val foo = mutableListOf<A>().apply { print("2 ") }
    @JvmField val bar = mutableListOf<A>().apply { print("3 ") }

    init {
        print("4")
    }
}

它将打印1 2 3 4

因此,在您的情况下,交换companion object中的两个声明就足够了:

companion object B {
    @JvmField val foo = mutableListOf<A>()   
    @JvmField val STATIC = A("hi")
}

答案 1 :(得分:3)

只需更改行的顺序:

@JvmField val foo = mutableListOf<A>()
@JvmField val STATIC = A("hi")

foo中使用A之前,它尚未初始化。