计算所有在Hashmap中添加键值的调用
在浏览 HashMap 实现和一些教程时,我想到了这个问题。但不知道如何解决这个问题。所以如果你们能帮助我,就在这里发帖。我想记录在 Map 中添加每个键值对的所有调用。它也应该计算对 put、putAll 和 putIfAbsent 所有方法的调用。
回答
主要有两种选择,
使用继承
- 假设
Map您要跟踪的实现允许扩展,然后创建一个子类并覆盖所需的方法。 - 在重写的方法中,执行自定义逻辑(计数),然后调用
super.基类的方法(实际方法)
这种方法的主要优点instanceof和generics编译器行为将是有利的。
这种方法有一个主要问题,即您需要扩展每个Map需要支持的类。这将导致类的爆炸。
使用组合
- 添加一个实现 Map 的新类(每个顶级相关类型)
- 有一个实际 Map 的参考变量
- 从 Map 接口实现方法
- 在实现中,做你的追踪操作,调用引用变量指向的地图
这种方法的主要优点是,很少有新的类。
这种行为的缺点是instanceof和generic用户预期的类型可能无法正常工作。
建议
- 如果你打算在一些大型应用程序中使用它,那么讨论更多关于未来可能的用例,并将 Map 创建部分抽象为一些工厂方法甚至工厂。这将允许您封装工厂中的实现细节。
- 或者尝试使用方法拦截器的某种方式。尽管这会略微增加延迟,但这不需要客户端进行太多更改,并且也避免了维护并行的
Map实现层次结构。 - 如果使用拦截器,我不知道您可以控制的详细程度。同样,这也将是复杂的。
- 学习这些技术是好的。请不要在生产代码中使用它们,除非这是唯一可能的选择。
笔记
count准确定义含义- 是否只计算来自该类用户的调用?
- 或者,甚至可以计算此类中出现的调用(例如
add调用get以查找存在)?