私が知っているところから、すべてのequalsオブジェクトは同じハッシュコードを持つ必要があります。しかし、equalsメソッドの中に複数のものがある場合は、それに従う必要がありますか?Javaハッシュコードの実装で複数の等価性とある場合
ロケーションはオブジェクト、ジャンクションはオブジェクト、長さは整数、オフセットは整数、セクションはオブジェクトです。
私はすでにatAJunctionメソッドのときに解決しましたが、ハッシュコードiは追加ハッシュコードとしてジャンクションを使用しました。 Sectionが等しい場合、セクションの長さは両方の位置のオフセットに等しくなります。私が使用しているハッシュコードは、sectionをハッシュコードとして使用しているだけです。
主な問題は、セクションが異なるがオフセットとエンドポイントが同じ場合です。その等価だがハッシュコードは異なる。
誰かが私の問題を助けることができますか?前にありがとう。 :)
これは私のEqualsメソッドです:
@Override
public boolean equals(Object object) {
if(object == null){
return false;
}
if(!(object instanceof Location)){
return false;
}else{
Location otherLocation = (Location) object;
if(atAJunction() && otherLocation.atAJunction()){
return this.endPoint.getJunction().equals(otherLocation.getEndPoint().getJunction());
}else{
// The Problem Here
if(this.endPoint.equals(otherLocation.endPoint)){
return this.offset == otherLocation.getOffset();
}else{
return this.section.equals(otherLocation.getSection()) &&
this.section.getLength() == (this.offset + otherLocation.getOffset());
}
}
}
}
そして、これは私のハッシュコードです:例については
@Override
public int hashCode() {
// creates a polynomial hash-code based on the fields of the class.
final int prime = 13; // an odd base prime
int result = 1; // the hash code under construction
if(atAJunction()){
result = prime * result + this.endPoint.getJunction().hashCode();
}else{
result = prime * result + this.section.hashCode();
}
return result;
}
equalsメソッドは正しいですか?平等性は再帰的でなければならないことを覚えておいてください:a.equals(b)とb.equals(c)then a.equals(c) - あなたがそのことを保証する方法がわかりません – Joni
脇役としてif文にreturn文は、後でelseを使用しないでください。冗長であり、コードに乱雑さを増やします。 – niilzon