2017-11-29 11 views
7

lateinitプロパティが初期化されているかどうかを確認しようとしています。
Kotlin 1.2では、そのためにisInitializedメソッドが用意されました。それはlateinitプロパティが宣言されているクラスでそれを行うときに機能します。 しかし、私は別のクラスからこれを呼び出すしようとすると、私は次の警告を得る:のisInitialized - この時点でlateinit varのバッキングフィールドにアクセスできない

バッキングフィールド「lateinitするvar FOO:バー」は、この時点ではアクセスできません

を私のモデルクラス(レッツPerson)は、Javaで書かれていると言う
他の二つのクラスには、(のはTest1Test2)はKotlin

で書かれているとしましょう

例:

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

この作業を取得するために、任意のチャンス?

私の現在の回避策は、personプロパティからisInitializedを返すTest1でメソッドを作成することです。

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

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

私は答えを知りません。しかし、なぜあなたはnullableの上で 'isInitialized'を使うのですか? 'lateinit'はオブジェクトが使用される前に常に初期化されます。 – Joshua

+0

@Elegyあなたのコードはコンパイルされません。 if式をクラス本体に直接置くことはできません。私はあなたがinitブロックの中にそれをラップするのを忘れたと思う。私は知っている、これはあなたの最初の問題を解決しません。 –

+0

@Joshua人がまだ初期化されていないケースが1つあります。 – ElegyD

答えて

0

lateinitプロパティはそうのようなUninitializedPropertyAccessExceptionを引くことにより、初期化されているかどうかをチェックすることができます:

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でしたことです – ElegyD

関連する問題