我(至少)有两个实现相同接口并具有相同字段的类。如果这两个类的字段相同或应该不同,那么具有相同的哈希码是否可以?这段代码可以吗?
interface Base { }
class A implements Base {
private Integer value;
public A(Integer value) { this.value = value; }
public int hashCode() { return value.hashCode(); }
}
class B implements Base {
private Integer value;
public B(Integer value) { this.value = value; }
public int hashCode() { return value.hashCode(); }
}
答案 0 :(得分:1)
我也遇到过类似的情况。基本上,实现(我有两个)看起来完全一样。
如果我只使用了一个类,那么当在另一个地方使用时,类名会造成混乱。因此,我继续进行两节课以提高可读性。
示例:使用pre
和post
初始化的挂钩导致创建两个类PreInit
和PostInit
。但是,那时的要求是在初始化之前和之后进行相同的操作。但是,在不久的将来,这种情况将会改变,并且每个都有不同的逻辑。
两个不同的对象可以具有相同的哈希码,并且这没什么不对的(只要您照顾好equals
)
答案 1 :(得分:1)
给出相同的hashCode()
的不同对象肯定是“可以”。它是哈希的性质有时会发生冲突。哈希码将潜在的无限范围映射到受限范围。冲突是不可避免的。尤其是在考虑不同类型的对象时,someA
和someB
是否具有相同或不同的哈希码真的没有太大关系!
但是除此之外,另一个答案是:您的问题暗示了一个设计问题。您不应该问“两个接口使用确切的哈希码是否可以”。您应该问:“为什么我为什么要在两个类中共享如此多的共同点?!”
这里的 real 问题是代码质量:您重复了字段,并且可能是处理这些字段的代码。最有可能的是,“更好”的方法是重构两个类,并将 common 方面推送到一个不同的类中,然后让您的两个类使用该公共类! / p>
答案 2 :(得分:0)
是的,可以为不同的对象使用相同的哈希码。
如您所知,哈希码范围受Java中int
类型的限制。但是对象的范围不受限制。不同对象具有称为 collision 的相同哈希码的情况。
为避免与此相关的错误,您应该记住哈希码和equals之间的约定:
1)如果两个对象相等,则它们必须具有相同的哈希码。
2)如果两个对象具有相同的哈希码,它们可能相等或可能不相等。
您可以找到有关here