所有实例都相等的类的HashCode实现

时间:2014-02-24 10:38:22

标签: java hashcode equality

假设我有一个类,其中所有实例都被认为是相等的。典型的用例是针对没有任何状态但只表现为函数的类。

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();
}

3 个答案:

答案 0 :(得分:6)

如果一个类没有状态,它应该是单例,抽象类或静态方法的存储库(如Math)。因此,为它重写equals和hashcode是没有意义的。

答案 1 :(得分:1)

您可以使用串行版本ID(将其转换为整数)。这将是每个班级的唯一编号。

尽管没有提供更多背景信息,但您尝试做的事情确实没有多大意义。如果这些对象是无状态的,那么只需将它们设为单个(如果您确实需要一个实例,例如将它们用作策略模式中的策略),或者如果您不需要实例,则将所有方法设置为静态。

我想如果它们都是实现相同接口的策略,那么能够比较它们就有意义,但如果每个实现都是单例,则默认为Object equalshashCode方法将做你需要的一切。

答案 2 :(得分:0)

我认为我有一个“合法的”(至少对我来说是这样的::-P)用例:我有一个类层次结构,其中一些子级具有状态而另一些则没有。无论如何,我想使用Map<BaseClass,Value>并将ChildClassWihtoutState extends BaseClass的所有实例用作地图的唯一键,而无需添加特殊的getInstance()

那么,如何使用合格的类名字符串的哈希值呢?它在jvm中应该是唯一的,对吧?

public int hashCode() {
   return getClass().getName().hashCode();
}