デカルト空間のノードなど、不変オブジェクトがあります。クラスは不変であるためhashCode
、非常に高速なハッシュのためにキャッシュします。
private final int hashCode;
private final double x, y, z;
public Node(final double x, final double y, final double z)
{
this.x = x;
this.y = y;
this.z = z;
this.hashCode = Objects.hashCode(this.x, this.y, this.z);
}
@Override
public boolean equals(final Object obj)
{
if (this == obj) { return true; }
if (obj == null) { return false; }
if (!(obj instanceof Node)) { return false; }
final Node other = (Node) obj;
return Objects.equal(this.x, other.x) && Objects.equal(this.y, other.y) && Objects.equal(this.z, other.z);
}
@Override
public int hashCode()
{
return this.hashCode;
}
はhashCode
一意であり、クラスのすべてのフィールドに依存しており、クラスは不変であるため、にNode
基づいて等価性のみをチェックするのは正しいでしょうhashCode
か?
@Override
public boolean equals(final Object obj)
{
if (this == obj) { return true; }
if (obj == null) { return false; }
if (!(obj instanceof Node)) { return false; }
final Node other = (Node) obj;
return this.hashCode == other.hashCode;
}
equals()
これは、 and のプロパティとそれらの相互作用について書いたすべての単体テストに合格しますがhashCode()
、何か不足しているのではないでしょうか?
注:Objects.hashCode()
とObjects.equal()
は、それぞれのメソッドに役立つ Guava クラスです。