我希望我的类有一个字段,该字段为所有公共(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/