首页 > 解决方案 > 如何在 Java 中缓存具有可变参数(Varargs)的函数的结果

问题描述

我有这样的Java方法:

  public <T> T queryDB(Class<T> klass, Object... objects) {
    return dbClient.get(klass, objects);
  }

我怎样才能缓存这个调用?它使用可变参数。我不确定如何正确构建缓存键?

标签: javacaching

解决方案


如果你根据你的klassandobject变量返回一些值,这意味着你有一个klassand的复合键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));

推荐阅读