Kotlin - 将可变列表公开为不可变列表的优雅方式

ser*_*0ne 6 kotlin

我有一个类,我希望能够在内部修改列表,但在外部我希望列表是不可变的;例如...

class Foo {
    val items: List<String> get() = mutableItems
    private val mutableItems: MutableList<String> = mutableListOf()
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方式来表达这一点?

Ten*_*r04 7

编辑:下面最初描述的功能已演变为显式支持字段功能,目前在 K2 编译器中原型化。使用显式支持字段,语法将是:

val items: List<String>
    field = mutableListOf()
Run Code Online (Sandbox Code Playgroud)

原答案:

不,但他们正在开发的东西可能会出现在 Kotlin 的未来版本中。建议的语法如下所示:

private val items: MutableList<String> = mutableListOf()
    public get(): List<String>
Run Code Online (Sandbox Code Playgroud)

这是语言设计负责人在谈论 Kotlin 未来可能的功能时提出的。

说得有点迂腐,您公开的是一个只读列表,而不是一个不可变的列表。

  • 嗯。或者换句话说:“只读”=无法通过该引用进行更改;“不可变”=_根本_无法更改。 (5认同)
  • 不可变意味着它的内容不可能改变。如果它是不变性的承诺,则获取此 List 属性的外部类将保证它可以多次迭代该列表并始终看到完全相同的结果。但它实际上只对外部类是只读的。他们不能指望它的内容永远不会仅根据界面而改变。 (2认同)