Java 这是一份令人满意的合同吗?

Java 这是一份令人满意的合同吗?,java,Java,在一本书中看到: 鉴于: 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 * ((

在一本书中看到:

鉴于:

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;
}
满足平等合同?

对于初学者,如果o不是SortOf,那么在运行时您将得到一个ClassCastException,而不仅仅是返回false

还有一份总合同,请参见下面的链接:

使用与计算等于计算hashCode相同的字段集

你问题中的方法不能做到这一点

关于这个话题的精彩问答:

对于初学者,如果o不是SortOf,那么在运行时您将得到一个ClassCastException,而不仅仅是返回false

还有一份总合同,请参见下面的链接:

使用与计算等于计算hashCode相同的字段集

你问题中的方法不能做到这一点

关于这个主题的出色问答:

假设SortOf A的代码为AA;bal=2;速率=2,SortOf B的代码=A;bal=4;比率=2; 然后对于A,code.length=2,bal=2,rate=2,B的code.length=1,bal=4,rate=2。然后A.equalsB但是A.hashCode!=B.hashCode

除了你对代码的其他问题,我认为这违反了合同

编辑添加:实际上,可能是equals的定义在技术上满足了的契约,这就不要求与hashCode保持一致。这是一个契约,契约要求与平等者保持一致。小脑袋和愚蠢的一致性是什么

这个等式是自反的,对称的,传递的,一致的。我猜它违反了约定,因为.equalsnull会抛出一个异常,而不是根据需要返回false。equals规范对hashCode的所有描述如下:

请注意,通常有必要 无论何时重写hashCode方法 此方法被重写,以便 维护项目的总合同 hashCode方法,该方法声明 相等的对象必须具有相等的哈希 代码

假设SortOf A的code=AA;bal=2;速率=2,SortOf B的代码=A;bal=4;比率=2; 然后对于A,code.length=2,bal=2,rate=2,B的code.length=1,bal=4,rate=2。然后A.equalsB但是A.hashCode!=B.hashCode

除了你对代码的其他问题,我认为这违反了合同

编辑添加:实际上,可能是equals的定义在技术上满足了的契约,这就不要求与hashCode保持一致。这是一个契约,契约要求与平等者保持一致。小脑袋和愚蠢的一致性是什么

这个等式是自反的,对称的,传递的,一致的。我猜它违反了约定,因为.equalsnull会抛出一个异常,而不是根据需要返回false。equals规范对hashCode的所有描述如下:

请注意,通常有必要 无论何时重写hashCode方法 此方法被重写,以便 维护项目的总合同 hashCode方法,该方法声明 相等的对象必须具有相等的哈希 代码

没有

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

然而

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

不过,一般来说,我认为你的发展方向是相反的:你有一个很自然的想法,就是什么应该使对象与你不适合的对象相等,然后考虑如何生成一个哈希代码来匹配它。

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

然而

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

不过,一般来说,我认为你的发展方向是相反的:你有一个很自然的想法,应该让你不适合的对象相等,然后考虑如何制作一个哈希代码来匹配它。

Joshua Bloch告诉你如何编写和测试equals和哈希代码,以使它们符合契约

更好的是,获得一个IDE,它可以为您完美地生成这两个方面。IntelliJ在这方面和其他许多方面都做得非常出色。

Joshua Bloch告诉您如何编写和测试equals和hashCode,以使它们符合合同


更好的是,获得一个IDE,它可以为您完美地生成这两个方面。IntelliJ在这方面和其他许多方面都做得非常出色。

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

其他人都没有这样做,但只是为了补充,作为一般规则,许多IDE环境(例如Eclipse)都提供equals/hashCode实现生成。一般来说,你会想这样做。不过要注意,如果您使用的是Hibernate之类的东西,那么构建它时不要使用那种会调用惰性init大型集合获取的方式,这一点非常重要。

而且不会,因为:SortOfo.code.length。通用域名格式
对字符串长度进行配对以测试相等性是不可靠的。@Kirk-Woll:可靠!=履行合同。这种方法很糟糕,但我的书上说它确实满足了合同,我挠头了……没有,因为:SortOfo.code.length。将字符串的长度与测试相等性进行比较是不可靠的。@Kirk-Woll:reliable!=履行合同。这个方法很糟糕,但我的书上说它确实满足了合同,我挠头了……我在这里两个都没有做,我正在分析一个现有的实现。考虑到你发布的方法的反馈,我想你很快就会编写和测试一个新的。Bloch告诉您如何评估这些方法,而无需在此询问。阅读链接-你会学到一些东西。我不认为你读过这个问题…它不是我的实现,而是一本评论书中的问题。我读过有效的Java,读过这本评论书,我认为提供的问题和答案有问题,我确实读过这个问题,我相信我理解它。你发布的equals不是Joshua Bloch建议你写的方式,所以我的答案和其他人一样是否定的。我做得更好,为你提供了一个积极的例子。你可以选择是否遵循它。我在这里实际上两个都不做,我正在分析一个现有的实现。根据你发布的方法的反馈,我认为你很快就会编写和测试一个新的实现。Bloch告诉您如何评估这些方法,而无需在此询问。阅读链接-你会学到一些东西。我不认为你读过这个问题…它不是我的实现,而是一本评论书中的问题。我读过有效的Java,读过这本评论书,我认为提供的问题和答案有问题,我确实读过这个问题,我相信我理解它。你发布的equals不是Joshua Bloch建议你写的方式,所以我的答案和其他人一样是否定的。我做得更好,为你提供了一个积极的例子。你可以选择是否遵循它。我认为你在这里的编辑就是答案。从技术上讲,问题只是问EQUALS合同是否有效。即使它确实打破了HASHCODE合同,但仍然存在。这是一个多么可怕的问题……关于不在null参数上返回false的部分足以打破equals契约。实现是不兼容的,我想这应该是你的结论,完全忽略了hashCode的任何功能。我认为你在这里的编辑就是答案。从技术上讲,问题只是问EQUALS合同是否有效。即使它确实打破了HASHCODE合同,但仍然存在。这是一个多么可怕的问题……关于不在null参数上返回false的部分足以打破equals契约。实现是不兼容的,我想这应该是您的结论,完全忽略了任何容量的hashCode。