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
之前,它没有被初始化。