【发布时间】:2018-03-15 00:26:30
【问题描述】:
我正在阅读 Kotlin 文档。在不变性部门,他们在下面发表评论。我想知道我们为什么要这样做?当我尝试示例代码时,它的作用相同。
不变性
更喜欢使用不可变数据而不是可变数据。始终声明局部变量 和属性为 val 而不是 var 如果它们之后没有被修改 初始化。
始终使用不可变的集合接口( Collection 、 List 、 Set 、 Map ) 来声明未变异的集合。使用工厂时 创建集合实例的函数,始终使用以下函数 尽可能返回不可变的集合类型:
// 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")
更新:对于任何投票给我的人。在写这个问题之前,我读了这本书,尝试了这个例子并尝试搜索。所以我没有足够的经验来解释或理解上面的段落。让我们考虑一下您对这个社区的贡献。如果我做错了,请告诉我。不要只点击一个按钮。
【问题讨论】:
-
如果您不打算更改数据结构,为什么要使用 mutable?如果任何具有不可变数据结构的东西会阻止您或其他人意外更改它。
-
对不起,我不想使用可变的。也许我不明白 Kotlin 中的
ArrayList<T>和List<T>。在 Java 中,List<T>只是一个Interface。因此,我无法理解这暗示。 -
List<T>也是 Kotlin 中的一个接口。 -
哦,所以这个问题代表
arrayListOf和listOf之间的区别。让我再次阅读 API 文档。谢谢你的帮助。 -
我认为你应该比较
MutableList<T>和List<T>。两者都是接口,而ArrayList<T>是Java 的具体类。ArrayList<T>在 Kotlin 中实现MutableList<T>。MutableList<T>扩展了List<T>,添加了最初不在List<T>中的可变性功能。
标签: kotlin immutability