我有(至少)两个实现相同接口并具有相同字段的类。如果这两个类的字段相同或者它们应该不同,那么这两个类是否具有相同的哈希码?这段代码好吗?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(); }}
3 回答
MMTTMM
TA贡献1869条经验 获得超4个赞
不同的对象给出相同hashCode()
的肯定是“好的”。有时会发生冲突是哈希的本质。哈希码将潜在的无限范围映射到受限范围。碰撞是不可避免的。考虑不同类型的对象尤其是当它确实没有太大的关系是否someA
与someB
具有相同或不同的散列码!
但除此之外,另一个答案是:您的问题暗示了设计问题。您不应该问“两个接口使用确切的哈希码是否可以”。你应该问:“为什么我最终得到了两个共享这么多共同点的类?!”
这里真正的问题是代码质量:您重复了字段,并且可能是处理这些字段的代码。最有可能的是,“更好”的方法是重构两个类,并将公共方面推入一个不同的类,然后让您的两个类使用该公共类!
慕侠2389804
TA贡献1719条经验 获得超6个赞
我也遇到过类似的情况。基本上,实现(我有两个)看起来完全一样。
如果我只使用了一个类,那么类名在其他地方使用时会造成混淆。因此,我继续使用两个类来提高可读性。
示例:使用的钩子pre
和post
某些东西的初始化导致创建两个类PreInit
和PostInit
. 但是,当时的要求是在 pre 和 post init 中做同样的事情。但是,在不久的将来,这种情况会发生变化,每个人都会有不同的逻辑。
两个不同的对象可以具有相同的哈希码,这没有任何问题(只要您注意equals
)
慕运维8079593
TA贡献1876条经验 获得超5个赞
添加回答
举报
0/150
提交
取消