为什么作者将localCacheBillingClient设计为lateinit?

Hel*_*oCW 8 kotlin

代码A是从项目play-billing-samples,你可以看到

不知道为什么作者设计localCacheBillingClient成这样lateinit,导致代码有点复杂,if (::localCacheBillingClient.isInitialized == false) {...}被调用了很多次。

我认为代码 B可以很好地工作,对吗?

代码 A

class BillingRepository private constructor(private val application: Application) :
        PurchasesUpdatedListener, BillingClientStateListener {

     lateinit private var localCacheBillingClient: LocalBillingDb


    val subsSkuDetailsListLiveData: LiveData<List<AugmentedSkuDetails>> by lazy {
        if (::localCacheBillingClient.isInitialized == false) {
            localCacheBillingClient = LocalBillingDb.getInstance(application)
        }
        localCacheBillingClient.skuDetailsDao().getSubscriptionSkuDetails()
    }

    val inappSkuDetailsListLiveData: LiveData<List<AugmentedSkuDetails>> by lazy {
        if (::localCacheBillingClient.isInitialized == false) {
            localCacheBillingClient = LocalBillingDb.getInstance(application)
        }
        localCacheBillingClient.skuDetailsDao().getInappSkuDetails()
    }

   fun startDataSourceConnections() {
        Log.d(LOG_TAG, "startDataSourceConnections")
        instantiateAndConnectToPlayBillingService()
        localCacheBillingClient = LocalBillingDb.getInstance(application)
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

代码 B

class BillingRepository private constructor(private val application: Application) :
        PurchasesUpdatedListener, BillingClientStateListener {

    private val localCacheBillingClient: LocalBillingDb by lazy {
         LocalBillingDb.getInstance(application)
    }

    val subsSkuDetailsListLiveData: LiveData<List<AugmentedSkuDetails>> by lazy {
        localCacheBillingClient.skuDetailsDao().getSubscriptionSkuDetails()
    }


    val inappSkuDetailsListLiveData: LiveData<List<AugmentedSkuDetails>> by lazy {
        localCacheBillingClient.skuDetailsDao().getInappSkuDetails()
    }

   fun startDataSourceConnections() {
        Log.d(LOG_TAG, "startDataSourceConnections")
        instantiateAndConnectToPlayBillingService()        
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

Hum*_*Bee 1

Kotlin - 使用“by Lazy”与“lateinit”进行属性初始化

我相信答案就在这条线索中,并且就在下面。

Lateinit var 可以从看到对象的任何地方进行初始化,例如从框架代码内部,并且对于单个类的不同对象来说,多个初始化场景是可能的。by lazy { ... } 反过来又定义了该属性的唯一初始值设定项,只能通过重写子类中的属性来更改该初始值设定项。如果您希望您的属性以事先可能未知的方式从外部初始化,请使用 Lateinit。