Android开发:为何用val声明MutableLiveData而非var?
为什么用val声明MutableLiveData而非var?
先搞懂val的本质:引用不可变≠对象不可变
Kotlin里的val不是说变量指向的对象完全不能改,而是这个变量的引用不能被重新赋值——也就是_liveData永远只能指向初始化时创建的那个MutableLiveData实例,不能改成指向另一个新的MutableLiveData。
而MutableLiveData本身就是设计用来修改内部value的,你调用_liveData.value = ...或者postValue,改的是这个对象内部的状态,不是变量的引用,这完全不违背val的特性。
为什么推荐用val而不是var?
- 防止意外引入bug:如果用var,后续代码里可能有人不小心写出
_liveData = MutableLiveData<String>()这种代码,把原来的LiveData实例替换掉。之前已经注册的观察者会绑定到老实例上,新的value更新就接收不到了,这种bug排查起来非常麻烦。用val从语法层面就杜绝了这种可能。 - 明确代码意图:ViewModel里的LiveData实例一般是初始化后就不会更换的,用val能清晰告诉其他维护者:这个变量的引用是固定的,只会修改它内部的value,不会换实例。代码可读性和可维护性更高。
- 契合封装原则:你对外暴露的是只读的
LiveData<String>,内部用val的MutableLiveData,既能保证内部可以更新数据,又能避免外部或者内部意外替换整个LiveData实例,让数据流更稳定。
关于两种写法的差异
你贴的两种写法现在功能确实等效,但var写法留了个隐患——允许重新赋值_liveData,而val写法从根源上封死了这个风险。在Android开发的最佳实践里,这种场景下优先用val是共识,因为它能减少潜在的bug点,让代码更健壮。
内容的提问来源于stack exchange,提问作者LineSmile
相关产品推荐
相关产品推荐

