Может ли CacheBuilder заменить MapMaker в моем случае? - PullRequest
0 голосов
/ 01 октября 2011

Мне нужно получить результат медленного метода slowResult() для экземпляров класса Something.Кэширование само по себе не помогает, так как экземпляры почти никогда не повторяются.К счастью, я знаю, что результат зависит на самом деле только от некоторых легко получаемых Attributes из Something, поэтому я мог бы использовать Map<Attributes, Result> в качестве кэша в коде

Result fastResult(Something something) {
    final Attributes attributes = attributesFor(something)
    Result result = cache.get(attributes);
    if (result!=null) return result;
    result = something.slowResult();
    cache.put(attributes, result);
    return result;
}

, чтобыограниченный кеш Я использовал устаревшие методы maximumSize и expireAfterAccess.Устаревание связано с тем, что вместо него будет использоваться новый класс CacheBuilder.Тем не менее, я не нашел хорошего способа применить его к моему делу.Ключи кеша должны быть экземплярами Attributes, но при загрузке кеша необходим экземпляр Something, и нет простого способа воссоздать его из Attributes.

Есть ли хорошее решение этой проблемы?

Ответы [ 3 ]

3 голосов
/ 01 октября 2011

Очень интересно! Я не думаю, что мы когда-либо слышали о таком случае.

Для 11.0 вы сможете сделать cache.asMap().put(), так что, вероятно, было бы хорошо просто пока игнорировать предупреждения об устаревании. Мы рассматриваем возможность , возможно, в версии патча 10.1, потому что несколько пользователей, похоже, находятся в похожей лодке.

Но в 11.0 другая идея, о которой мы говорим, позволит вам сделать это:

Result fastResult(final Something something) {
  return cache.get(
      attributesFor(something),
      new Callable<Result>() {
        public Result call() {
          return something.slowResult();
        }
      });
}
0 голосов
/ 02 октября 2011

Что ж, одним из способов решения этой проблемы является «как я могу сравнить Attributes.equals() для кэша, но при этом иметь доступ к Something для создания значения». Итак, я думаю, что это может сработать ...

class SomethingKey {
  private Something something;
  private final Attributes attributes;
  SomethingKey(Something s) {
    this.something = s;
    this.attributes = attributesFor(something);
  }
  public Result createResult() {
    Something something = this.s;
    this.s = null;
    return something.slowResult();
  }
  public boolean equals(Object o) {
    if(o==this) return true;
    if(o==null || o.getClass() != this.getClass) return false;
    SomethingKey that = (SomethingKey)o;
    return this.attributes.equals(that.attributes);
  }
}

А потом CacheLoader.load в основном

Result load(SomethingKey k) {
   return k.createResult();
}

А карта будет

Cache<SomethingKey,Result> map = ...;

Конечно, недостатком является то, что вы создаете новый SomethingKey для каждого запроса, но ...

0 голосов
/ 01 октября 2011

Можете ли вы вместо этого просто отключить кеш чего-нибудь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...