java - 如何在 Java 中缓存具有可变参数(Varargs)的函数的结果
问题描述
我有这样的Java方法:
public <T> T queryDB(Class<T> klass, Object... objects) {
return dbClient.get(klass, objects);
}
我怎样才能缓存这个调用?它使用可变参数。我不确定如何正确构建缓存键?
解决方案
如果你根据你的klass
andobject
变量返回一些值,这意味着你有一个klass
and的复合键object
。
您可以做的是将这些对象封装到一个类中,例如MyKey
:
public class MyKey <T> {
Class<T> klass;
Object[] objects;
public MyKey(Class<T> klass, Object... objects) {
this.klass = klass;
this.objects = objects;
}
@Override
public boolean equals(Object obj) {
//implement this method comparing klass and objects
}
@Override
public int hashCode() {
//calculate a hash based on klass and objects' hashes
}
}
覆盖equals()
和hashCode()
此类的方法(强制!),根据klass
和 计算它们的值 objects variables
。
注意:objects
是一个数组,所以你必须使用Arrays.equals()
方法来比较它。
最后,HashMap
用你的MyKey
类作为键创建一个缓存值作为映射的值:
Map<MyKey<T>, T> cache = new HashMap<>();
每次要检查值是否经过哈希处理时,请调用
cache.get(new MyKey(klass, objects));
推荐阅读
- css - Flex wrap 布局和父宽度
- python - 在 pandas 数据框中仅旋转两列并添加其中一列
- java - 从循环中打印数组
- python - 如何在 PyTorch 中将两个张量轴相乘?
- html - 试图让旋转木马进入旋转木马
- java - 硬件帮助错误**线程“main”中的异常java.lang.NullPointerException**,程序在命令行中运行良好但不是eclipse或整洁的bean
- javascript - 如何在不修改 vue 3 中的道具的情况下使用道具初始化状态
- node.js - node.js child_process 在运行某些进程时返回 code = null
- django - 在 urls.py 中扩展路径名
- python - 为已在 InstaPy 库中分配的类似创建异常