该代码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)
Kotlin - 使用“by Lazy”与“lateinit”进行属性初始化
我相信答案就在这条线索中,并且就在下面。
Lateinit var 可以从看到对象的任何地方进行初始化,例如从框架代码内部,并且对于单个类的不同对象来说,多个初始化场景是可能的。by lazy { ... } 反过来又定义了该属性的唯一初始值设定项,只能通过重写子类中的属性来更改该初始值设定项。如果您希望您的属性以事先可能未知的方式从外部初始化,请使用 Lateinit。
归档时间: |
|
查看次数: |
117 次 |
最近记录: |