【问题标题】:using guava cache without a load function使用没有加载功能的番石榴缓存
【发布时间】:2012-11-12 01:09:56
【问题描述】:

我的 java 应用有一个缓存,我想换掉当前的缓存实现并用 guava 缓存替换它。

不幸的是,我的应用程序的缓存使用似乎与 guava 缓存的工作方式不匹配。我想要的只是能够创建一个空缓存,使用“get”方法从缓存中读取一个项目,并使用“put”方法将一个项目存储在缓存中。我不希望“get”调用尝试将项目添加到缓存中。

看来LoadingCache 类有我需要的get 和put 方法。但我无法弄清楚如何在不提供“加载”功能的情况下创建缓存。

我的第一次尝试是这样的:

LoadingCache<String, String> CACHE = CacheBuilder.newBuilder().build();

但这会导致这个编译器错误:不兼容的类型;不存在类型变量 K1,V1 的实例,因此 Cache 符合 LoadingCache

显然我必须传入一个具有“加载”方法的 CacheLoader。

(我想我可以创建一个 CacheLoader,它有一个“加载”方法,只是抛出一个异常,但这似乎有点奇怪和低效。这样做是正确的吗?)

【问题讨论】:

  • 我很想说(根据您发布的信息),它听起来不像是一个缓存,而不仅仅是一个地图。
  • @Sean Parsons:恕我直言,Cache 和 Map 之间更重要的区别是前者可能随时忘记事情。加载是一项附加功能。
  • 我更想弄清楚它是否真的是一个缓存。

标签: java caching guava


【解决方案1】:

CacheBuilder.build() 返回一个非加载缓存。正是你想要的。只需使用

Cache<String, String> cache = CacheBuilder.newBuilder().build();

【讨论】:

  • 对我来说它显示编译时错误。它无法从 转换为 泛型。我正在将此库用于 android。
  • @CreativeManix 你必须使用缓存类而不是 LoadingCache。
  • 谢谢@Zai 我明白了。
  • 希望 Google 在文档中对此进行解释 - 他们提供的唯一示例是 LoadingCache。
  • (编辑了之前的评论)。然后,您可以使用 .getIfPresent(Object key) 来检索内容,而无需提供加载器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多