Kotlin – ¿Es posible inicializar el object compañero antes del bloque de inicio en una class?

¿Es posible inicializar un companion object antes del bloque de init en una class de Kotlin? ¿Si es así, cómo? Si no, hay una manera de lograr lo mismo.

Tengo el siguiente escenario,

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

y llamar a printAllStatics causa una exception de puntero nulo.

Los inicializadores de propiedad y los bloques init se ejecutan exactamente en el mismo order en que se colocan en un cuerpo de class / object. Aquí hay un ejemplo:

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

Imprimirá 1 2 3 4 .

Entonces, en tu caso, intercambiar las dos declaraciones en el companion object es suficiente:

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

Solo cambia el order de las líneas:

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

Antes de usar foo en A pero no se inicializó.