以下代码来自项目播放计费示例。
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 { ... }
块(和构造函数等效于在定义点进行初始化,因为它们都是在对象被认为正确构造之前运行的。
在声明、所有初始化器块和构造函数的组合中,任何val
变量都必须初始化一次。