【问题标题】:Why can a val variable be assigned data in Kotlin?为什么可以在 Kotlin 中为 val 变量分配数据?
【发布时间】:2020-08-04 03:24:29
【问题描述】:

以下代码来自项目play-billing-samples

private val repositoryval,为什么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 的概念相似。

标签: android kotlin


【解决方案1】:

为了初始化val 变量,声明行、任何初始化程序块(init { ... } 块)和构造函数都等效于在定义点进行初始化,因为它们都在考虑对象之前运行结构合理。

任何val 变量必须在声明、所有初始化程序块和构造函数的组合中只初始化一次。

【讨论】:

    猜你喜欢
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 2019-07-10
    • 2022-06-29
    • 1970-01-01
    相关资源
    最近更新 更多