Как кэшировать результат для функции с переменными аргументами (Varargs) в Java - PullRequest
0 голосов
/ 29 марта 2019

У меня есть такой метод Java:

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

Как я могу кешировать этот звонок? Он использует переменные аргументы. Я не уверен, как правильно построить ключ кэша?

1 Ответ

1 голос
/ 29 марта 2019

Если вы возвращаете какое-то значение, основанное на ваших klass и object переменных, это означает, что у вас есть составной ключ klass и 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 и объектов variables.
Примечание : objects - это массив, поэтому для его сравнения необходимо использовать метод Arrays.equals().

И, наконец, создайте HashMap с вашим классом MyKey в качестве ключа и кэшированным значением в качестве значения карты:

Map<MyKey<T>, T> cache = new HashMap<>();

Каждый раз, когда вы хотите проверить, хэшировано ли значение, звоните

cache.get(new MyKey(klass, objects));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...