为什么用val类型声明mutableelvedata类?



为什么不使用val类型的mutableelivedata作为var类型的替代品?

可以在val类型上设置,这不是一种违反吗?


例如:

  1. val类型
  2. 的示例
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 type
class LoadDetailViewModel : ViewModel() {
private var _liveData = MutableLiveData<String>()
var liveData: LiveData<String> get() = _liveData
fun loadData() = viewModelScope.launch {
_liveData.value = "value"
_liveData.postValue("value")
}
}

但是结果仍然是等价的。没有错误,当我声明mutableelvedata为var,但我不知道为什么我必须声明它为val。


  • 我理解在Kotlin语言的val类型是一个不可变的类型,var类型是一个可变的类型。
  • 那么将其声明为var类型不是正确的吗?

Android开发者我查阅了Android的官方文件,但是没有答案。

当您调用_liveData.value = "value"时,请注意您没有使用_liveData =。所以你没有改变属性_liveData也不需要是var。你正在mutableelivedata 内部改变属性

使用var是错误的,因为您没有交换出MutableLiveData的实例。如果您将它更改为其他实例,则不会通知您的观察者。

你混淆了属性(保存MutableLiveData实例引用的东西)和类(MutableLiveData本身)的可变性。mutableelvedata是一个可变类,因为它内部有可变变量。你可以改变它,但是你不希望改变持有它的引用的属性。

使用var不会引起任何问题,因为您实际上没有使用可变性来更改对不同实例的引用。但是,由于您永远不应该这样做,因此没有理由使用var而不是val。使用val可以使代码更清晰,更健壮。

相关内容

  • 没有找到相关文章

最新更新