kotlin - 如何将可变集合变成不可变集合

我正在编写一小段代码,在其中我在一个可变映射中内部处理我的数据,而该映射又具有可变列表。

我想向 API 用户公开我的数据,但为了避免任何不安全的数据发布,我想在不可变集合中公开它,即使在内部由可变集合处理时也是如此。

class School {

    val roster: MutableMap<Int, MutableList<String>> = mutableMapOf<Int, MutableList<String>>()

    fun add(name: String, grade: Int): Unit {
        val students = roster.getOrPut(grade) { mutableListOf() }
        if (!students.contains(name)) {
            students.add(name)
        }
    }

    fun sort(): Map<Int, List<String>> {
        return db().mapValues { entry -> entry.value.sorted() }
                .toSortedMap()
    }

    fun grade(grade: Int) = db().getOrElse(grade, { listOf() })
    fun db(): Map<Int, List<String>> = roster //Uh oh!
}

我设法在我的类的公共(public) API 中只公开了 MapList(它们是不可变的),但我实际公开的实例仍然是 本质上是可变的。

这意味着 API 用户可以简单地将我返回的 map 转换为 ImmutableMap 并获得对我的类内部的宝贵私有(private)数据的访问权限,而这些数据旨在防止此类访问。

我在集合工厂方法 mutableMapOf()mutableListOf() 中找不到复制构造函数,所以我想知道什么是最好和最有效的方法将可变集合变成不可变集合。

有什么建议或建议吗?

最佳答案

使用 CollectionsMutable 列表转换为 Immutable 列表,示例:

可变列表:

val mutableList = mutableListOf<String>()

转换为不可变列表:

val immutableList = Collections.unmodifiableList(mutableList)

https://stackoverflow.com/questions/37931676/

相关文章:

java - 为 Kotlin 创建 POJO 类

input - 在 Kotlin 中读取控制台输入

android - kotlin 和 ArgumentCaptor - IllegalStateEx

android - Android 中的 AsyncTask 与 Kotlin

android - Unresolved reference DaggerApplicationCo

android - 如何像在 Swift 中一样从 Kotlin 中的函数返回多个值?

kotlin - 无需额外对象分配的数组/列表迭代

properties - Kotlin 中是否有 didSet/willSet 模拟?

android - 如何在 kotlin 中使用 Android Support typedef 注

kotlin - 'by' 关键字在 Kotlin 中的作用是什么?