java - Kotlin:公共(public) getter 返回不可变列表,但私有(private) getter 应该返回可变列表

标签 java kotlin collections

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

   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()
   }

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

最佳答案

在 Kotlin 中,每个 MutableList<T>也是一个List<T> .所以,你可以创建一个 MutableList在私有(private)字段中,声明一个类型为 List 的附加字段指向同一个对象。在类内部,您可以使用可变引用来修改列表,并公开 List到外面。

例子:

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

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

关于java - Kotlin:公共(public) getter 返回不可变列表,但私有(private) getter 应该返回可变列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65116128/

相关文章:

multithreading - 智能转换是不可能的,因为 ... 是一个可变的属性,此时可能已经改变

gradle - 如何使用 gradle kotlin-dsl 添加新的源集

vba - 将项目添加到 VBA/VB6 集合时出错

java - 如何按升序排序 ArrayList<Object> android

java - Android Studio 上的 NoClassDefFoundError

java - 在 JSTL 中将 java 日期对象转换为毫秒

单行Java终端程序输出

java - 在 Windows 上访问智能卡时重用 Java Keystore

android - 将Alpha最高设置为0%,最低设置为70%-Android-Kotlin

c# - 将项目添加到 Dictionary<int, List<int>>