Зачем объявлять класс mutableLiveData с типом val?

Почему бы не использовать mutableLiveData типа val вместо типа var?

Не является ли нарушением возможность установки типа val?


Как, например:

  1. Пример типа val
class LoadDetailViewModel : ViewModel() {

    private val _liveData = MutableLiveData<String>()
    val liveData: LiveData<String> get() = _liveData

    fun loadData() = viewModelScope.launch {
        _liveData.value = "value"
        _liveData.postValue("value")
    }
}

  1. Код изменен на тип var
class LoadDetailViewModel : ViewModel() {

    private var _liveData = MutableLiveData<String>()
    var liveData: LiveData<String> get() = _liveData

    fun loadData() = viewModelScope.launch {
        _liveData.value = "value"
        _liveData.postValue("value")
    }
}

Но результат все равно эквивалентен. Нет ошибки, когда я объявляю mutableLiveData как var, но я не знаю, почему я должен объявлять его как val.


  • Я так понимаю, что тип val в языке Kotlin — неизменный тип, а тип var — изменяемый тип.
  • Тогда разве не правильно объявить его как тип var?

Android-разработчики Я искал официальные документы Android, но ответа на них не было.

Очень тесно связано: stackoverflow.com/q/51718229/5133585

Sweeper 31.03.2023 15:27
1
1
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы звоните _liveData.value = "value", обратите внимание, что вы не используете _liveData =. Таким образом, вы не изменяете свойство _liveData, и оно не обязательно должно быть var. Вы изменяете свойство внутри MutableLiveData.

Неправильно использовать для этого var, потому что вы не заменяете экземпляр MutableLiveData. Если вы измените его на другой экземпляр, ваши наблюдатели не будут уведомлены.

Вы путаете изменчивость свойства (то, что содержит ссылку на экземпляр MutableLiveData) с классом (сам MutableLiveData). MutableLiveData — это изменяемый класс, поскольку внутри него есть изменяемые переменные. Вы можете изменить его, но не хотите изменять свойство, которое содержит ссылку на него.

Использование var не вызывает никаких проблем, потому что вы на самом деле не использовали изменчивость для изменения ссылки на другой экземпляр. Но поскольку вы никогда не должны этого делать, нет причин использовать var вместо val. Это делает код более понятным и надежным в использовании val.

Другие вопросы по теме