当前位置: 首页 > 知识库问答 >
问题:

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

卢志强
2023-03-14

我在看科特林的文件。在不变性部门,他们的评论如下。我想知道我们为什么要这样做?当我尝试示例代码时,它的作用是相同的。

不变性

首选使用不可变数据而不是可变数据。如果初始化后未修改局部变量和属性,请始终将它们声明为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")

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

共有1个答案

韩夕
2023-03-14

根据@Akavall先生和@Naetmul先生的建议。我再次阅读了方法文档的列表。问题是,我忽略了listOf方法返回的list对象不能添加任何新项。

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

 类似资料:
  • 问题内容: 我指的是Apple的Swift编程指南,以了解如何用Swift语言创建可变/不可变对象(数组,字典,集合,数据)。但是我不明白如何在Swift中创建一个不可变的集合。 我希望在Objective-C中看到以下Swift中的等效项 不变数组 可变数组 不变字典 可变字典 问题答案: 创建不可变数组 第一种方式: 第二种方式: 创建可变数组 将对象追加到数组 辞典 创建不可变字典 创建可变

  • 问题内容: 这是一个真正的初学者问题(我仍在学习Java基础知识)。 我可以(有点)理解为什么方法将返回而不是,或者为什么它们将接受List参数而不是ArrayList。如果对方法没有影响(即,如果不需要ArrayList中的特殊方法),则这将使该方法更加灵活,并且更易于调用者使用。其他集合类型(例如Set或Map)也是如此。 我不明白的是:创建这样的局部变量似乎是一种惯例: 虽然这种形式的频率较

  • 问题内容: 从Java 1.6 Collection Framework文档中 : 不支持任何修改操作(如类别,和)被称为 不可修改的 。[…]额外保证Collection对象中的任何更改都将不可见的Collection被称为 不可变的 。 第二个标准使我有些困惑。鉴于第一个集合是不可修改的,并且假定原始集合引用已被删除,那么第二行中提到的更改是什么?它是指集合中包含的元素的变化,即元素的状态吗?

  • 有没有一种方法可以内省一个变量,直接找出它是用什么子集声明的?在这里,我创建了一个子集,但内省指出了它的基本类型: 我知道它必须将信息存储在某个地方,因为如果我尝试重新分配与子集不匹配的值,它会失败: 我试着搜索代码,但我很快就找到了像container这样的文件。c和perl6\U操作。c代码让我眼前一亮。我认为X::TypeCheck::Assignment可能会有所帮助(请参见核心/异常.p

  • 问题内容: 我读到要使一个类在Java中不可变,我们应该执行以下操作: Do not provide any setters Mark all fields as private Make the class final标记为私有 为什么需要步骤3?我为什么要上课呢? 问题答案: 如果你不标记该类,那么我可能会突然使你看似不变的类真正变得可变。例如,考虑以下代码: 现在,假设我执行以下操作: 注意

  • 问题内容: 为什么我们要在Java类中声明一个接口? 例如: 问题答案: 当您想在对象中收集一些字段以强调概念时,可以创建一个外部类,也可以创建一个内部类(称为嵌套(静态)或内部)。 如果要强调这个合作类在原始对象使用之外完全没有意义(没有用)的事实,可以将其嵌套/内部。 因此,在处理某些层次结构时,可以描述一个“嵌套” ,它将由包装类的子类实现。 在JDK中,最显著的例子是内部接口中定义的接口,