web-dev-qa-db-ja.com

isInitialized-lateinit varのバッキングフィールドはこの時点ではアクセスできません

lateinitプロパティが初期化されているかどうかを確認しようとしています。
Kotlin 1.2には、そのためのisInitializedメソッドがあります。 lateinitプロパティが宣言されているクラスでそれを行うと動作します。しかし、別のクラスからこれを呼び出そうとすると、次の警告が表示されます。

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

私のモデルクラス(たとえばPerson)はJavaで記述されています
他の2つのクラス(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
        }
    }
}

これを機能させるチャンスはありますか?

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

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

//in Test2:
if (test1.isPersonInitialized()) {
    // Works
}
27
ElegyD

docs によると:

このチェックは、字句的にアクセス可能な、つまり同じ型または外部型のいずれか、または同じファイルの最上位で宣言されているプロパティでのみ使用できます。

これが、メイン関数でそれを確認できない理由です。

6
Raghavendra

受け入れられた回答 で記述された制約に対する本当に簡単な回避策は次のとおりです。

class LateClass {
    lateinit var thing: Thing
    fun isThingInitialized() = ::thing.isInitialized
}

class Client {
    val lateClass = LateClass()
    ... things happen ...
    if (lateClass.isThingInitialized() {
        // do stuff with lateClass.thing, safely
    }
}
29
AutonomousApps

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
Willi Mentzel