java - 获取不可修改的 MultiKeyMap
问题描述
我正在使用MultiKeyMap
由org.apache.commons.collections4.map
. 我需要通过getter方法返回这个地图的一个不可修改的视图,这样客户端就不能修改它。对于 java 的内置地图,我可以使用Collections.unmodifiableMap()
方法,但对于这个特定的地图,我找不到任何类似的方法。实现这一目标的最佳方法是什么?
解决方案
由于MultiKeyMap<K,V>
实现了接口java.util.Map<MultiKey<? extends K>,V>
,你应该没有问题包装你的MultiKeyMap
with Collections.unmodifiableMap()
。您可能只需要使用不同的方式来访问元素:对于每个get
调用,您需要传递一个显式 created MultiKey
,但这不应该是一个主要问题。
然而,你真的想这样做吗?通过返回一个不可修改的字段视图,您将泄露您的类的实现细节;也就是说,您会泄露它是使用 Apache 类中的字段实现的这一事实。如果您稍后想将其更改为使用,例如 Guava,那么您将不得不四处寻找您班级的所有用户并将他们更改为get
使用不同的参数进行调用。因此,与其返回集合字段(尽管是不可修改的视图),不如考虑为集合的各个元素添加 getter 方法。即你会写get(key1, key2)
等。有关更多详细信息,请参阅:
https://www.martinfowler.com/bliki/EncapsulatedCollection.html
推荐阅读
- elasticsearch - 通过 IP 前缀聚合 ElasticSearch 中的对象
- php - 在服务器 php bitnami 上上传文件的问题
- reactjs - 如何在 react-table v6 中保留/保存最后访问的页面?
- javascript - 事件处理程序在触发时触发多次
- python - 让 python 的 __init__.py 文件链接到一个类,而不在简单的包导入时执行包含它的文件
- c# - 如何在存在常量的情况下检测 C# 代码中的静态代码依赖关系?
- settings - 亚马逊 FBA 仓库是否适用于国内备份仓库工作流程?
- terraform - 如何为 Terraform S3 后端资源传递变量?
- rest - 资源不在 URL 中时的 REST API URL 结构
- r - R_splitting 基于列 NA 值出现的数据帧