Kotlin - 是否可以在 class 中的 init 块之前初始化伴随对象?
Kotlin - Is it possible to initialize companion object before the init block in a class?
是否可以在 Kotlin class 中的 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
会导致空指针异常。
只需更改行的顺序:
@JvmField val foo = mutableListOf<A>()
@JvmField val STATIC = A("hi")
之前您在 A
中使用 foo
但它没有被初始化。
属性 初始化器和 init
块的执行顺序与它们在 class/object 主体中的放置顺序完全相同。这是一个例子:
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")
}
是否可以在 Kotlin class 中的 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
会导致空指针异常。
只需更改行的顺序:
@JvmField val foo = mutableListOf<A>()
@JvmField val STATIC = A("hi")
之前您在 A
中使用 foo
但它没有被初始化。
属性 初始化器和 init
块的执行顺序与它们在 class/object 主体中的放置顺序完全相同。这是一个例子:
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")
}