我正在编写一小段代码,在其中我在一个可变映射中内部处理我的数据,而该映射又具有可变列表。
我想向 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 中只公开了 Map
和 List
(它们是不可变的),但我实际公开的实例仍然是 本质上是可变的。
这意味着 API 用户可以简单地将我返回的 map 转换为 ImmutableMap 并获得对我的类内部的宝贵私有(private)数据的访问权限,而这些数据旨在防止此类访问。
我在集合工厂方法 mutableMapOf()
或 mutableListOf()
中找不到复制构造函数,所以我想知道什么是最好和最有效的方法将可变集合变成不可变集合。
有什么建议或建议吗?
最佳答案
使用 Collections 将 Mutable 列表转换为 Immutable 列表,示例:
可变列表:
val mutableList = mutableListOf<String>()
转换为不可变列表:
val immutableList = Collections.unmodifiableList(mutableList)
https://stackoverflow.com/questions/37931676/