Kotlinはどのように安全にlateinit変数にアクセスしますか?


Ktlin設計の最初はNull変数ではない宣言期間に初期化を行わないことが許されています。この問題を解決するために、Ktlin lateinitはまず変数を宣言してから、プログラム実行周期の将来のある時に初期化して、コンパイル検査時に属性変数が初期化されていないためにエラーが発生しないようにします。初期化していないと以下の異常が発生します。

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'is not accessible at this point
この反射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
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。