Почему переменной val можно присвоить данные в Kotlin? - PullRequest
0 голосов
/ 04 августа 2020

Следующий код взят из проекта 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
    }

...
}

1 Ответ

0 голосов
/ 04 августа 2020

Для целей инициализации val переменных строка объявления, любые блоки инициализатора (блоки init { ... }) и конструктор эквивалентны инициализации в точке определения, потому что все они запускаются до того, как объект будет рассмотрен. правильно сконструированы.

Любые val переменные должны быть инициализированы ровно один раз в комбинации объявления, всех блоков инициализатора и конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...