2013-10-31 8 views
5

Я хотел бы использовать guavas CacheBuilder, но не могу найти явного примера, как реализовать это.Как использовать guava CacheBuilder?

Документы сформулируют следующий код:

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() 
     .maximumSize(1000) 
     .build(
      new CacheLoader<Key, Graph>() { 
      public Graph load(Key key) throws AnyException { 
       return createExpensiveGraph(key); 
      } 
      }); 

Вопрос: что это createExpensiveGraph(key) метода? Это метод, который возвращает отображение HashMap<Key, Value>? Что я должен делать с значением key?

Или я могу просто вернуть List<String> в этом методе, не имея значения key?

+0

См. Api метода CacheLoader и загрузки, который дает четкое представление о том, почему этот метод используется? http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/CacheLoader.html#load(K) createExpensiveGraph не возвращает hashMap, а возвращает объект Graph. –

+0

Это какая-то функция, которую вы пытаетесь кэшировать. –

ответ

17

Идея кэша является то, что вы, как правило, эту проблему:

Graph get(Key key) { 
    Graph result = get(key); 
    if(null == result) { 
     result = createNewGraph(key); 
     put(key, result); 
    } 
    return result; 
} 

плюс обычные проблемы синхронизации, которые у вас есть, когда вы используете этот код в многопоточной среде.

Guava делает шаблон для вас; вам просто нужно реализовать createNewGraph(). Как работает Java, это означает, что вам нужно реализовать интерфейс. В этом случае интерфейс равен CacheLoader.

Если вы считаете, что весь кеш немного похож на карту, то CacheLoader - это обратный вызов, который вызывается всякий раз, когда ключ не может быть найден на карте. Загрузчик получит ключ (поскольку он обычно содержит полезную информацию для создания объекта, ожидаемого для этого ключа), и он вернет значение, которое должно возвращаться в будущем. get().

Смежные вопросы