代码之家  ›  专栏  ›  技术社区  ›  Tom Tresansky

这是一个满足等于实现的合同吗?

  •  1
  • Tom Tresansky  · 技术社区  · 15 年前

    鉴于:

    class SortOf {
      String name;
      int bal;
      String code;
      short rate;
      public int hashCode() {
        return (code.length() * bal);
      }
    }
    

    执行以下操作:

    public boolean equals(Object o) {
      return ((SortOf)o).code.length() * ((SortOf)o).bal * ((SortOf)o).rate == this.code.length() * this.bal * this.rate;
    }
    

    满足 equals

    5 回复  |  直到 15 年前
        1
  •  4
  •   andersoj    15 年前

    假设 SortOf A code = "AA"; bal=2; rate=2 和 SortOf B code = "A"; bal=4; rate=2; 那么对于 A , code.length = 2 bal = 2 , rate = 2 和 B code.length = 1 , bal = 4 , rate=2 A.equals(B) 但是 A.hashCode() != B.hashCode()

    除了你在守则上的其他问题,我认为这违反了合同。

    编辑以添加 :实际上,可能是 equals() Object.equals() ,不要求与 hashCode() . 这是我们的合同 Object.hashCode() 等于() . 小脑袋和愚蠢的坚持到底是怎么回事。。。?<andersoj离开去申请法学院>

    这个 是自反的,对称的,传递的,一致的。我想这违反了合同,因为 .equals(null) 抛出异常而不是返回 false 等于() 规格说明 是:

    注意,通常有必要 覆盖 hashCode 方法 此方法被重写,以便 维持总合同 哈希码 方法,它声明 相等的对象必须具有相等的哈希

        2
  •  3
  •   Community Mohan Dere    9 年前

    不。

    首先,你会得到 ClassCastException false )如果 o 不是 SortOf .

    使用与计算equals()和计算hashCode()相同的字段集。


    本主题优秀问答: What issues should be considered when overriding equals and hashCode in Java?

        3
  •  3
  •   duffymo    15 年前

    约书亚·布洛赫告诉你 precisely 和测试

    更好的是,得到一个能完美地为你生成这两个的IDE。IntelliJ在这方面和其他许多方面都做得很出色。

        4
  •  1
  •   Thilo    15 年前

    如果对象相等,则它们必须具有相同的哈希代码。

     100 * 10 * 10  =  200 * 10 * 5    (equals)
    

    但是

     100 * 10  != 200 * 10    (hashCode)
    

        5
  •  1
  •   jcalvert    15 年前

    其他人都说“不”,但作为一般规则,许多IDE环境(即Eclipse)都提供equals()/hashCode()实现生成。一般来说,你会想这样做。不过,要注意的是,如果您使用的是Hibernate之类的东西,那么很重要的一点是不要以一种可以调用惰性in it的大型集合获取的方式来构造它。