lateinit
プロパティが初期化されているかどうかを確認しようとしています。
Kotlin 1.2には、そのためのisInitialized
メソッドがあります。 lateinitプロパティが宣言されているクラスでそれを行うと動作します。しかし、別のクラスからこれを呼び出そうとすると、次の警告が表示されます。
「lateinit var foo:Bar」のバッキングフィールドは、この時点ではアクセスできません
私のモデルクラス(たとえばPerson
)はJavaで記述されています
他の2つのクラス(Test1
とTest2
としましょう)は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
}
docs によると:
このチェックは、字句的にアクセス可能な、つまり同じ型または外部型のいずれか、または同じファイルの最上位で宣言されているプロパティでのみ使用できます。
これが、メイン関数でそれを確認できない理由です。
受け入れられた回答 で記述された制約に対する本当に簡単な回避策は次のとおりです。
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
}
}
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
}