为什么总是应该使用不可变的集合接口来声明在 Kotlin 中没有突变的集合?



我正在阅读 Kotlin 文档。在不变性领域,他们在下面评论。我想知道我们为什么要这样做?当我尝试示例代码时,它的行为相同。

不变性

更喜欢使用不可变数据而不是可变数据。始终声明局部变量 和属性作为 val 而不是 var,如果它们在之后没有被修改 初始化。

始终使用不可变的集合接口(集合、列表、设置、 映射 ) 来声明未变异的集合。使用工厂时 函数创建集合实例,始终使用 尽可能返回不可变的集合类型:

// Bad: use of mutable collection type for value which will not be mutated
fun validateValue(actualValue: String, allowedValues: HashSet<String>) { ... }
// Good: immutable collection type used instead
fun validateValue(actualValue: String, allowedValues: Set<String>) { ... }
// Bad: arrayListOf() returns ArrayList<T>, which is a mutable collection type
val allowedValues = arrayListOf("a", "b", "c")
// Good: listOf() returns List<T>
val allowedValues = listOf("a", "b", "c")

更新:对于任何投票否决我的人。在写这个问题之前,我读了这本书,尝试了这个例子并尝试搜索。所以我没有足够的经验来解释或理解上面的段落。让我们考虑一下你对这个社区的贡献。如果我做错了,请告诉我。不要只单击一个按钮。

作为Mr.@Akavall和Mr.@Naetmul的建议。我再次阅读了listOf方法的文档。问题我错过了listOf方法返回无法添加任何新项的列表对象。

我认为您应该比较可变列表和列表。两者都是 接口,而 ArrayList 是来自 Java 的具体类。 ArrayList 在 Kotlin 中实现了 MutableList。可变列表 扩展列表,添加不在 最初列出。

最新更新