【问题标题】:Kotlin: Public getter returns immutable list but private getter should return mutable listKotlin:公共 getter 返回不可变列表,但私有 getter 应返回可变列表
【发布时间】:2020-12-02 21:06:01
【问题描述】:

我希望我的类有一个字段,该字段为所有公共访问返回一个不可变列表,但在对象实例内部我希望该列表是可变的,因此我可以向其中添加元素。

   class GrammarParser {
    private val grammars: List<Grammar> = mutableListOf()
    get() = field.toList()
   }

试试

 class GrammarParser {
    private val _grammars: MutableList<Grammar> = mutableListOf()
    val grammars: List<Grammar>
    get() = this._grammars.toList()
   }

我试过了,但不确定这是否被认为是好的做法?

【问题讨论】:

  • 以下链接中已经回答了问题:stackoverflow.com/questions/30348292/…。除非你在 Kotlin 语法中需要它?
  • @bramdc 转换在第一个示例中不起作用,因为get() = field.toMutableList() 会显示编译器错误,因为grammars 的返回值是List&lt;Grammar&gt; 而不是MutableList&lt;Grammar&gt; 已经尝试过。顺便说一句,Kotlin 语法应该是这样的。

标签: java kotlin collections


【解决方案1】:

在 Kotlin 中,每个 MutableList&lt;T&gt; 也是一个 List&lt;T&gt;。因此,您可以在私有字段中创建一个MutableList,并声明一个指向同一对象的List 类型的附加字段。在类内部,您可以使用可变引用来修改列表,并将List 暴露给外部。

例子:

class GrammarParser {
    private val mutableGrammars = mutableListOf<Grammar>()
    val grammars: List<Grammar> = mutableGrammars
}

在第二个示例中,每次调用 getter 时都会创建列表的副本(快照)。这意味着,在您调用 getter 并获得列表后,即使 _grammars 在其他地方被修改,更改也不会反映在您获得引用的只读列表视图中。这可能是您想要的 - 那么您正在做的事情就可以了。但是,如果这不是您要寻找的东西,那么我上面给出的示例将避免复制。

【讨论】:

  • List 不是不可变的,这是一个重要的区别。它是一个可变列表的只读视图。
  • @Tenfour04 你是对的,我编辑了答案以使其更清晰。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 2019-06-13
  • 2021-08-16
相关资源
最近更新 更多