【问题标题】:Using Google Guava CacheLoader for custom class as Key将 Google Guava CacheLoader 用于自定义类作为 Key
【发布时间】:2022-01-13 16:47:03
【问题描述】:

我正在尝试将 Google Guava CacheLoader 用于自定义类作为 Key。

@Value.Immutable
public interface RecordAggregatorRequest {
    String name();

    String date();
}


private final LoadingCache<RecordAggregatorRequest, Map<String, Record>> recordsCache = CacheBuilder.newBuilder()
            .expireAfterWrite(Duration.ofMinutes(30))
            .build(CacheLoader.from(recordAggregator::getRecords));

然后像这样调用:

final Map<String, Record> recordsMap = recordsCache.get(aggregatorRequest);

recordAggregator::getRecords 每次都被调用。我怀疑这是因为 RecordAggregatorRequest 键的哈希码每次都不同,即使成员值相同。有没有办法让它作为 Key 用于自定义类?

【问题讨论】:

  • 您是否尝试过修复您的哈希码逻辑,使其不会“每次都不同”?
  • 目前,我还没有编写任何计算哈希的逻辑。有点依赖谷歌番石榴为我做这件事(这是行不通的)

标签: java guava


【解决方案1】:

您应该在您的自定义 java 类上实现适当的 hashcode 和 equals 方法。

Guava 不了解您的类的内部细节,并且依赖于 equals 和 hashcode 的有意义的实现。一旦将这些对象添加到缓存中,它们也应该是有效的不可变对象,否则可能会发生坏事。

大多数代码生成器都可以为您生成好的等号/哈希码,或者您也可以使用AutoValue

【讨论】:

  • 感谢您的回答!就我而言,关键是一个不可变接口。所以 equals 和 hashcode override 在这里不起作用。有没有办法让它在这方面发挥作用?
  • 为什么在不可变类型上没有正确的 equals 和 hashCode?听起来问题出在@Value.Immutable
  • 你的意思是 Google Guava 应该为具有相同成员值的不同对象计算相同的哈希码吗?
  • 如果 @Value.Immutable 来自 immutables.io,那么它会正确计算 hashCode 和 equals(基于对象的属性,在这种情况下都是字符串)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 2017-04-20
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 2016-03-24
相关资源
最近更新 更多