Kotlin:暴露API中的不可变列表

我是Kotlin的新手,并且正在解决返回不可变内部可变列表版本的问题。

我回顾了下面的’ Kotlin:通过转换修改(不可变的)列表,是否合法? ‘并理解不可变列表实际上只是只读的视图,不公开修改方法。

我想要一个暴露“不可变”列表的类,并且仍然想要利用Kotlins自动获取器(不必提供获取列表或列表成员的所有样板)

下面是一个坏主意(或者它会导致在将来的版本中可能被阻止的问题)

class Foo { val names: List = LinkedList; fun addName(name: String) { (names as LinkedList).add(name) } } 

我正在寻找允许(例如):

  val foo = Foo; println(foo.names.size) 

但仍然阻止调用者修改类的内部(至少尽可能)。 例如删除元素或清除后备列表。

以下工作:

 class Foo { private val _names: MutableList = mutableListOf() val names: List get() = _names.toList() fun addName(name: String) { _names.add(name) } } 

toList意味着如果他们将其转换为MutableList并尝试添加它,则会得到一个UnsupportedOperationException_names字段将保存真实数据,并且通过names属性完成外部访问

将可变列表定义为带有下划线(Kotlin中的一种“字段”)的私有属性,并通过另一个公共只读属性公开它。

如果“字段”是只读的,这将做的伎俩(@JWT建议):

 class Foo { private val _names: MutableList = mutableListOf() val names: List = _names fun addName(name: String) { _names.add(name) } } 

如果可以重新分配“字段”,则需要将getter定义为函数(note var _names ):

 class Foo2 { private var _names: MutableList = mutableListOf() val names: List get() = _names fun addName(name: String) { _names.add(name) } fun reset() { _names = mutableListOf() } } 

测试可在这里 。