【发布时间】:2015-11-18 20:18:49
【问题描述】:
在处理来自数据库的用户对象时,通常有一个 id 和一个用户名,通常通过 id 或用户名搜索用户。
如果我现在想找到用户并喜欢使用 Guava 缓存,我必须创建两个缓存。一种是按 id 缓存,一种是按用户名缓存。
但两者都指向同一个对象。
是否可以只使用一个LoadingCache?
我考虑过使用用户对象本身作为键 LoadingCache<User, User> 并在用户对象中实现等于和哈希码。
在 equals 方法中,如果 id 或 用户名相等,则很容易说两个 User 对象相等。
但是我怎样才能生成一个适用于这种场景的好的 hashCode 方法呢?
对此有什么想法吗?
【问题讨论】:
-
我不清楚为什么你只想使用一个缓存。在这种情况下,使用两个缓存似乎是正确的做法。 (让你的 equals 方法像那样工作肯定会破坏事情;
equals应该是可传递的,而你的逻辑不是。) -
在 Guava Cache 的前身中,我有一个提供此功能的 indexable cache 示例。很少需要我们没有将这个概念引入 Guava。不过,基本思想可以在您自己的代码中进行调整(例如,使用 Guava 的
Striped)。