2016-10-31 92 views
6

Czy możliwe jest zainicjowanie bloku companion object przed blokiem init w klasie Kotlin? Jeśli tak to jak? Jeśli nie, czy istnieje sposób na osiągnięcie tego samego.Kotlin - Czy możliwe jest zainicjowanie obiektu towarzyszącego przed blokiem init w klasie?

Mam następujący scenariusz,

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

i nazywając printAllStatics powoduje wyjątek null pointer.

+0

IMO to jak chcesz. Jaki jest twój błąd? – mklimek

+0

Niestety, mój MWE nie pokazał rzeczywistego problemu. Mój błąd –

Odpowiedz

6

Bloki inicjalizacji właściwości i init są wykonywane w dokładnie tej samej kolejności, w jakiej są umieszczone w treści klasy/obiektu. Oto przykład:

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

To będzie drukować 1 2 3 4.

Więc w twoim przypadku, wymieniając dwie deklaracje w companion object wystarczy:

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

Wystarczy zmienić kolejność linii:

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

Przed wykorzystywane foo w A ale nie została zainicjowana.