【发布时间】:2016-06-20 20:55:26
【问题描述】:
我正在编写一小段代码,在其中我在一个可变映射中内部处理我的数据,而该映射又具有可变列表。
我想向 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!
}
我设法在我的类的公共 API 中仅公开了 Map 和 List(它们是不可变的),但我实际公开的实例仍然本质上是可变的。
这意味着 API 用户可以简单地将我返回的地图转换为 ImmutableMap 并获得对我的类内部的宝贵私有数据的访问权,而这些数据旨在受到这种访问的保护。
我在集合工厂方法 mutableMapOf() 或 mutableListOf() 中找不到复制构造函数,所以我想知道将可变集合转换为不可变集合的最佳和最有效的方法是什么。
有什么建议或建议吗?
【问题讨论】:
标签: kotlin