2017-11-29 166 views
7

Bir lateinit özelliğinin başlatılmış olup olmadığını kontrol etmeye çalışıyorum.
Kotlin 1.2'de bunun için isInitialized yöntemine sahibiz. Bunu, lateinit özelliğinin bildirildiği sınıfta yaptığımda çalışır. arasındaisInitialized - lateinit var destek alanı bu noktada erişilemiyor

Taban alanını 'lateinit var foo: Bar' ı aşağıdaki uyarıyı almak başka sınıftan bu aramaya çalıştığınızda Ama (haydi bu noktada

Benim modelim sınıf erişilebilir değil Person) Java ile yazılmış demek
diğer iki sınıfları (en Test1 ve Test2) KOTLIN

yazılır diyelim

Örnek:

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

bu çalışma almak için şansı var mı?

Geçerli çözümüm, Test1'de isInitialized değerini person özelliğinden döndüren bir yöntem yapmaktır.

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

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

ben cevabı bilmiyorum. Ama niçin niçin ''InInitialized' kullanılır? 'Lateinit' gösterisi her zaman nesne kullanımdan önce başlatılır. – Joshua

+0

@Eledgy kodunuz derlenmiyor. If ifadesini doğrudan bir sınıf gövdesine koyamazsınız. init bloğu içine sarmayı unuttuğunu düşünüyorum. Biliyorum, bu inital probleminizi çözmez. –

+0

@Joshua Kişinin henüz başlatılamadığı bir durum var. – ElegyD

cevap

0

bir lateinit özellik şöyle UninitializedPropertyAccessException alıcı tarafından başlatıldı olmadığını kontrol edebilirsiniz:

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

Kotlin 1.1'de bunu yaptım. – ElegyD