Kotlin – 是否可以在类的init块之前初始化伴侣对象?

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

我有以下情况,

 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会导致一个空指针异常。

属性初始值设定项和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") } 

只要改变行的顺序:

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

A使用foo之前,它没有被初始化。