首页 > 解决方案 > 如何避免在 kotlin 中暴露可变属性?

问题描述

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

class A {

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

}

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

所以我解决了这个重写上面的代码:

class A {

  private val mutList = mutableListOf<String>()

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

}

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

标签: kotlinmutable

解决方案


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

private val _list = mutableListOf<String>

val list: List<String>
  get() = _list

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

对于实时数据非常有用

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

fun update(text: String) {
    _liveText.value = text
}

因此,在 ViewModel 中,您公开了 observable,但封装了 mutable。


推荐阅读