2013-10-31 18 views
5

Chciałbym użyć guavas CacheBuilder, ale nie mogę znaleźć żadnego wyraźnego przykładu jak to zaimplementować.Jak korzystać z guava CacheBuilder?

Docs podać następujący kod:

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

Pytanie: Jaka jest ta metoda createExpensiveGraph(key)? Czy jest to metoda, która zwraca mapowanie HashMap<Key, Value>? Co mam zrobić z wartością key?

Czy mogę też po prostu zwrócić w tej metodzie List<String> bez konieczności używania wartości key w jakikolwiek sposób?

+0

Zobacz api metody CacheLoader i metody ładowania, która wyjaśnia, dlaczego użyto tej metody? http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/CacheLoader.html#load(K) createExpensiveGraph nie zwraca hashMap zamiast zwracać obiekt wykresu. –

+0

Jest to funkcja, której próbujesz buforować wynik. –

Odpowiedz

17

Pomysł cache jest to, że zwykle mają ten problem:

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

plusa zwykłe problemy z synchronizacją, które masz przy korzystaniu z tego kodu w środowisku wielowątkowym.

Guava wykonuje dla Ciebie koszulkę; po prostu musisz wdrożyć createNewGraph(). Sposób działania Java, oznacza to, że musisz zaimplementować interfejs. W tym przypadku interfejs to CacheLoader.

Jeśli uważasz, że cała pamięć podręczna jest trochę jak mapa, to CacheLoader to wywołanie zwrotne wywoływane za każdym razem, gdy klucza nie można znaleźć na mapie. Program ładujący otrzyma klucz (ponieważ zwykle zawiera użyteczne informacje do utworzenia obiektu, który jest oczekiwany dla tego klucza) i zwróci wartość, która powinna zostać zwrócona w przyszłości przez get().