2013-10-31 67 views
5

我想使用番石榴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

查看CacheLoader和load方法的api,它给出了为什么使用该方法的明确含义? 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; 
} 

加上你,当你在多线程环境中使用此代码通常的同步问题。

番石榴为您做了样板;你只需要执行createNewGraph()。 Java的工作方式,这意味着你必须实现一个接口。在这种情况下,界面是CacheLoader

如果您认为整个缓存有点像地图,那么CacheLoader是一个回调,只要在地图中找不到密钥就会被调用。加载器将获得密钥(因为它通常包含有用的信息来创建该密钥所期望的对象),并且它将返回未来应返回的值。

相关问题