假设我有一个类,其中所有实例都被认为是相等的。典型的用例是针对没有任何状态但只表现为函数的类。
public class ToStringFunction implements Function<Object, String> {
@Override
public String apply(Object o) {
return o.toString();
}
@Override
public boolean equals(Object o) {
return o instanceof ToStringFunction;
}
}
现在,应该如何实现hashCode方法?当然,为了遵守equals / hashCode合约,它需要是一个常量值。但那应该是什么价值?如果使用诸如0或1之类的某些微不足道的值,则可能导致与其他类似类的冲突。
所以这似乎归结为这个问题:如何实现一个对于给定类可能是唯一的hashCode,但对于它的所有实例都是相同的。
我想出了这两个想法。你怎么想,他们是否理智?
@Override
public int hashCode() {
return ToStringFunction.class.hashCode();
}
@Override
public int hashCode() {
return "ToStringFunction".hashCode();
}
答案 0 :(得分:6)
如果一个类没有状态,它应该是单例,抽象类或静态方法的存储库(如Math)。因此,为它重写equals和hashcode是没有意义的。
答案 1 :(得分:1)
您可以使用串行版本ID(将其转换为整数)。这将是每个班级的唯一编号。
尽管没有提供更多背景信息,但您尝试做的事情确实没有多大意义。如果这些对象是无状态的,那么只需将它们设为单个(如果您确实需要一个实例,例如将它们用作策略模式中的策略),或者如果您不需要实例,则将所有方法设置为静态。
我想如果它们都是实现相同接口的策略,那么能够比较它们就有意义,但如果每个实现都是单例,则默认为Object
equals
和hashCode
方法将做你需要的一切。
答案 2 :(得分:0)
我认为我有一个“合法的”(至少对我来说是这样的::-P)用例:我有一个类层次结构,其中一些子级具有状态而另一些则没有。无论如何,我想使用Map<BaseClass,Value>
并将ChildClassWihtoutState extends BaseClass
的所有实例用作地图的唯一键,而无需添加特殊的getInstance()
。
那么,如何使用合格的类名字符串的哈希值呢?它在jvm中应该是唯一的,对吧?
public int hashCode() {
return getClass().getName().hashCode();
}