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")
}