【发布时间】:2020-08-04 03:24:29
【问题描述】:
以下代码来自项目play-billing-samples。
private val repository 是val,为什么repository = BillingRepository.getInstance(application) 可以正常工作?
在我看来,val 必须在定义时初始化,例如 private val repository: BillingRepository by lazy {BillingRepository.getInstance(application)}。
代码
class BillingViewModel(application: Application) : AndroidViewModel(application) {
val gasTankLiveData: LiveData<GasTank>
val premiumCarLiveData: LiveData<PremiumCar>
val goldStatusLiveData: LiveData<GoldStatus>
val subsSkuDetailsListLiveData: LiveData<List<AugmentedSkuDetails>>
val inappSkuDetailsListLiveData: LiveData<List<AugmentedSkuDetails>>
private val LOG_TAG = "BillingViewModel"
private val viewModelScope = CoroutineScope(Job() + Dispatchers.Main)
private val repository: BillingRepository
init {
repository = BillingRepository.getInstance(application)
repository.startDataSourceConnections()
gasTankLiveData = repository.gasTankLiveData
premiumCarLiveData = repository.premiumCarLiveData
goldStatusLiveData = repository.goldStatusLiveData
subsSkuDetailsListLiveData = repository.subsSkuDetailsListLiveData
inappSkuDetailsListLiveData = repository.inappSkuDetailsListLiveData
}
...
}
【问题讨论】:
-
val 必须被初始化一次并且永远不能改变。它不会引起任何问题,因为您在 init {} 中对其进行初始化,只要 BillingViewModel 初始化,存储库也会被初始化。如果您将存储库初始化移出 init{},则会出现错误。
-
val 应该只初始化一次。直接或在构造函数内部。它与
blank final variable in java的概念相似。