【问题标题】:Kotlin: Assert ImmutabilityKotlin:断言不变性
【发布时间】:2020-06-22 23:22:22
【问题描述】:

我有一个内部维护一个可变列表的类,我想在这个列表上提供一个不可变的视图。目前我正在使用以下内容:

/**The list that actually stores which element is at which position*/
private val list: MutableList<T> = ArrayList()

/**Immutable view of [list] to the outside.*/
val listView: List<T> get() = list.toList()

第一个问题:这可以做得更容易

第二个问题:我如何测试 listView 实际上是不可变的。我想反思是必要的?

【问题讨论】:

  • 这不是一成不变的观点。这是一个只读视图。重要区别。任何有权访问支持 MutableList 的人都可以更改内容。

标签: kotlin reflection collections immutability


【解决方案1】:

如果您只需要 compile-time 类型是不可变的,您可以简单地向上转换您的列表:

val listView: List<T> get() = list

(不过,如果您检查并向下转换为 MutableList,您可以进行更改 - 这些会影响原始列表。)

但是,如果您想要完全不变性,那就很棘手了。我认为 Kotlin 标准库中没有任何通用的真正不可变列表。

虽然ListMutableList 看起来像两种不同的类型,但在 Kotlin/JVM 中它们都编译为字节码中的相同类型,这是可变的。即使在 Kotlin 中,虽然 Iterable.toList() 确实返回了一个新列表,但当前的实现*实际上给出了一个 MutableList,它已被向上转换为 List。 (虽然变异它不会改变原始列表。)

不过,一些第三方库提供了真正不可变的集合;见this question

要检查 List 是否可变,您可以使用简单的类型检查:

if (listView is MutableList)
    // …

无需显式使用反射。 (像 is considered 这样的类型检查是隐式反射。)

(* 当然,这可以改变。如果没有文档支持,过多阅读当前代码通常是错误的。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 2018-09-21
    相关资源
    最近更新 更多