2017-11-29 143 views
7

Próbuję sprawdzić, czy została zainicjowana właściwość lateinit.
W Kotlin 1.2 mamy teraz metodę isInitialized. Działa, gdy robię to w klasie, w której zadeklarowana jest właściwość lateinit. Ale gdy próbuję zadzwonić to z innej klasy pojawia się następujące ostrzeżenie:isInitialized - Pole kopii lateinit var jest niedostępne w tym momencie

podkładzie pole „lateinit var foo: bar” nie jest dostępny w tym momencie

mojej klasie modelu (powiedzmy, powiedzmy Person) jest napisany w Javie
Dwóch innych klas (powiedzmy Test1 i Test2) są zapisywane w Kotlin

Przykład:

class Test1 { 
    lateinit var person: Person 

    fun method() { 
     if (::person.isInitialized) { 
      // This works 
     } 
    } 
} 

-

class Test2 { 
    lateinit var test1: Test1 

    fun method() { 
     if (test1::person.isInitialized) { 
      // Error 
     } 
    } 
} 

jakaś szansa, aby dostać tę pracę?

Moje bieżące obejście polega na wykonaniu metody w Test1, która zwraca isInitialized z właściwości person.

fun isPersonInitialized(): Boolean = ::person.isInitialized 

//in Test2: 
if (test1.isPersonInitialized()) { 
    // Works 
} 
+0

ja nie znam odpowiedzi. Ale dlaczego używasz 'isInitialized' ponad nullable? 'lateinit' show zawsze należy zainicjować przed użyciem obiektu. – Joshua

+0

@Eledgy Twój kod się nie kompiluje. nie można umieścić wyrażenia if bezpośrednio w treści klasy. Myślę, że zapomniałeś zapakować go do bloku init. wiem, to nie rozwiązuje twojego podstawowego problemu. –

+0

@Joshua Mam jeden przypadek, w którym nie można jeszcze zainicjować osoby – ElegyD

Odpowiedz

0

Można sprawdzić, czy nieruchomość lateinit został zainicjowany przez łapanie UninitializedPropertyAccessException jak tak:

class Person { 
    lateinit var name: String 
} 

class Test { 
    lateinit var person1: Person 
    lateinit var person2: Person 

    init { 
     try { 
      println(person1.name) 
     } 
     catch(e: UninitializedPropertyAccessException) { // is thrown because person1 has not been initialized 
      println("ups") 
     } 

     person2 = Person() 

     try { 
      println(person2.name) 
     } 
     catch(e: UninitializedPropertyAccessException) { // is thrown because person2.name has not been initialized 
      println("ups") 
     } 
    } 
} 

fun main(args: Array<String>) { 
    Test() // ups ups 
} 
+0

Tak właśnie zrobiłem w Kotlin 1.1 – ElegyD