Kotlinはどのように安全にlateinit変数にアクセスしますか?
Ktlin設計の最初はNull変数ではない宣言期間に初期化を行わないことが許されています。この問題を解決するために、Ktlin lateinitはまず変数を宣言してから、プログラム実行周期の将来のある時に初期化して、コンパイル検査時に属性変数が初期化されていないためにエラーが発生しないようにします。初期化していないと以下の異常が発生します。
Kotlin:Backing field of'var mList:Mutble List'is not accessible at this point
この反射APIの限定のため、もちろんinner classは許可されています。具体的な設計の詳細は公式を参照してください。
したがって、類似の需要があれば、直接ターゲットクラスに新しい方法を追加して、lateinit属性を確認することができます。
参考:StockOverflow
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
kotlin.UninitializedPropertyAccessException: lateinit property mList has not been initialized
したがって、Kotlin 1.2およびより高いバージョンでは、反射に基づくAPIを頻繁に使用して、lateinit属性が初期化されているかどうかを迅速に確認する。
private lateinit var mList: MutableList<String>
fun main(args: Array<String>) {
if (::mList.isInitialized) {
mList.add("")
}
}
ただし、クラスの中に一つのlateinit属性があったら、別のクラスでそれが初期化されていることを確認してみます。次のようになります。
class PreA{
lateinit var mList: MutableList<String>
}
class PreB{
val mPreA = PreA()
fun print(){
if (mPreA::mList.isInitialized){
}
}
}
会議のエラー:Kotlin:Backing field of'var mList:Mutble List
この反射APIの限定のため、もちろんinner classは許可されています。具体的な設計の詳細は公式を参照してください。
したがって、類似の需要があれば、直接ターゲットクラスに新しい方法を追加して、lateinit属性を確認することができます。
class PreA{
lateinit var mList: MutableList<String>
fun isListInitialised() = ::mList.isInitialized
}
class PreB{
val mPreA = PreA()
fun print(){
if (mPreA.isListInitialised()){
mPreA.mList.add("")
}
}
}
もちろんUnityialized PropertyAcceptionを捕獲してもいいです。参考:StockOverflow
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。