【问题标题】:Why should Always use immutable collection interfaces to declare collections which are not mutated in Kotlin?为什么要始终使用不可变集合接口来声明在 Kotlin 中未发生变异的集合?
【发布时间】: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&lt;T&gt;List&lt;T&gt;。在 Java 中,List&lt;T&gt; 只是一个Interface。因此,我无法理解这暗示。
  • List&lt;T&gt; 也是 Kotlin 中的一个接口。
  • 哦,所以这个问题代表arrayListOflistOf 之间的区别。让我再次阅读 API 文档。谢谢你的帮助。
  • 我认为你应该比较 MutableList&lt;T&gt;List&lt;T&gt;。两者都是接口,而ArrayList&lt;T&gt; 是Java 的具体类。 ArrayList&lt;T&gt; 在 Kotlin 中实现 MutableList&lt;T&gt;MutableList&lt;T&gt; 扩展了 List&lt;T&gt;,添加了最初不在 List&lt;T&gt; 中的可变性功能。

标签: kotlin immutability


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-11-30
    • 2016-02-17
    • 2019-02-03
    • 1970-01-01
    • 2012-01-19
    • 2011-03-11
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多