我正在使用ehcache(通过Grails插件)。将对象添加到缓存的方法要求密钥可序列化,因此典型的用法是:
def key = 22
def someObject = new Object();
cacheService.cache(key, true, someObject)
(布尔参数指示是否应将对象添加到分布式或本地缓存中)
我的问题是如何从值对象生成密钥,例如:
class Person implements Serializable {
String firstName
String lastName
Integer age
}
一种方法是提供hashCode()和equals()方法,并使用hashCode作为键。在这种情况下,我不需要使Person类实现Serializable。
或者,我可以简单地使用Person对象本身作为键。看起来我仍然需要提供equals和hashCode方法,但是还需要实现Serializable。但是,使用此方法发生冲突的可能性似乎较小,因为Person只能等于另一个Person实例。
我假设ehcache使用密钥的equals()方法来确定缓存中是否已存在该密钥,这个假设是否正确?
上述任何一种方法本质上都比其他方法更好,还是有其他方法我没有考虑过?
谢谢, 唐
答案 0 :(得分:1)
您的hashkey问题主要与可序列化问题正交。在回答hashkey时,我会使用Apache Commons HashCodeBuilder。它为您完成所有繁重的工作。与equals类似,使用EqualsBuilder。
请记住,哈希码需要在对象的生命周期内保持不变,因此只对那些不会改变的内部元素进行哈希处理。
我会避免使用Person对象作为键,因为它会调用它的equals()来检查键比较,这可能比比较整数哈希码要慢。