【发布时间】:2014-03-25 23:19:46
【问题描述】:
假设我有一个类,其中所有实例都被认为是相等的。一个典型的用例是用于没有任何状态但仅表现为函数的类。
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();
}
【问题讨论】:
-
基于类的方法对我来说看起来不错...但是如果我可以问,您需要 equals/hashCode 做什么?
-
我认为当对象没有状态只是函数时,您不需要将它们放入集合中。
-
我没有具体的用例,但我想您可能想要一组要应用于某些数据的操作。例如,JDK Comparator 在其接口中定义了 equals:docs.oracle.com/javase/7/docs/api/java/util/Comparator.html