如何避免暴露 kotlin 中的可变属性?

Lun*_*lpo 1 mutable kotlin

假设有一个带有属性列表的类 A:

class A {

  val list = mutableListOf<String>()
  
  fun addAText() {
    list.add("a text")
  }

}
Run Code Online (Sandbox Code Playgroud)

但现在不仅方法addAText()可以将字符串添加到列表中,而且来自世界各地的每个人都可以。

所以我将上面的代码重写为:

class A {

  private val mutList = mutableListOf<String>()

  val list: List<String>
  get() = mutList
  
  fun addAText() {
    mutList.add("a text")
  }

}
Run Code Online (Sandbox Code Playgroud)

那么问题是:有更好的方法吗?像任何语法支持或标准 kotlin 库一样?额外的私有属性似乎不是一个优雅的解决方案。

cut*_*iko 7

这是最好的方法,并且有一个使用下划线的约定。重复相同的命名,但为私有添加下划线。

private val _list = mutableListOf<String>

val list: List<String>
  get() = _list
Run Code Online (Sandbox Code Playgroud)

是命名约定的一部分,称为支持属性

对于实时数据非常有用

private val _liveText = MutableLiveData("default")
val liveText: LiveData<String>
     get()  = _liveText

fun update(text: String) {
    _liveText.value = text
}
Run Code Online (Sandbox Code Playgroud)

因此,在 ViewModel 中,您公开了可观察的内容,但封装了可变的内容。