来自多个字段的Java hashCode

mko*_*ram 7 java oop equals hashcode

鉴于这样一个类:

class MyObject {
  private String id1;
  private String id2;

  @Override
  public boolean equals(Object o) {
    if (o == this) return true;
    if (!(o instanceof MyObject)) {
        return false;
    }
    MyObject other = (MyObject) o;
    return id1.equals(other.id1) || id2.equals(other.id2);
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,相等不依赖于两个字段匹配,两个字段都有效.什么是hashCode这个类的合适实现?

And*_*ner 10

这不是有效的实现equals.

具体而言,它违反了及物性要求.

因此hashCode,除了使所有实例具有相同的哈希码之外,您也无法实现"正确".

  • 或者创建自己的类来为您执行这些操作,但不要假装是Set. (4认同)
  • 你不应该做那个抽象,而不是假装是一个`HashSet`或`Set`的东西.`Set`s应该只反映`equals`行为,_correct_,契约满足`equals`行为. (3认同)
  • @mkohram扩展HashSet*从不*听起来像是正确的事情,特别是如果你正在改变现有方法的行为. (2认同)