いくつかのクラスAにequalsメソッドを実装する必要があります。クラスAには列挙型のordererコレクションがあり、達成したい動作は、コレクション内にまったく同じEnum値を持つクラスAの2つのインスタンスに対してequalsがtrueを返すことです。 (コレクションのまったく同じ位置にあります)。
私はJavaに慣れていないので、これに問題があり、equalsまたはハッシュコードメソッドを適切に実装する方法がわからないので、どんな助けでもいいでしょう:)
Eclipseを使用している場合(ほとんどのJava IDEと同様に、netbeansにも同様の機能があります)、[ソース]メニューに移動し、[hashcode()とequals()を生成]を選択できます。次に、検討するフィールド(この場合は列挙値のリスト)を選択します。
そうは言っても、すでに列挙型があると仮定すると、eclipseが生成したコードは次のとおりです。そのハッシュコードには通常、素数と乗算および加算が含まれるわけではありません。これにより、値がある程度適切に分散される傾向があります。
public class Foo {
private List<FooEnum> enumValues;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((enumValues == null) ? 0 : enumValues.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Foo other = (Foo) obj;
if (enumValues == null) {
if (other.enumValues != null)
return false;
}
else if (!enumValues.equals(other.enumValues))
return false;
return true;
}
}
オーバーライドされたequalsメソッドは次のようになります
public boolean equals(Object o) {
if ((o instanceof yourtype) &&
(((yourtype)o).getPropertyToTest() == this.propertyToTest)) {
return true;
}
else {
return false;
}
}
オーバーライドされたhashCodeメソッドは次のようになります
public int hashCode() { return anIntRepresentingTheHashCode}
javadocsから取得すると、equalsメソッドは次の基準を満たしている必要があります。
反射的-x.equals(x)はtrueです
対称-x.equals(y)の場合はy.equals(x)
推移的-x.equals(y)およびy.equals(z)の場合、x.equals(z)
一貫性-x.equals(y)がtrueの場合、オブジェクトが変更されない限り、常にtrueになります
null -x.equals(null)はfalseです
また、equalsメソッドに基づいて2つのオブジェクトが等しい場合、それらは同一のハッシュコードを持っている必要があります。
逆は当てはまりません。2つのオブジェクトが等しくない場合、それらは同一のハッシュコードを持っている場合と持っていない場合があります
使用EnumSet
Javaのドキュメントに従って自然な順序を保持し、列挙型のみに最適化されています。
iteratorメソッドによって返されるイテレータは、要素を自然な順序(列挙型定数が宣言される順序)でトラバースします。返されるイテレータの一貫性は弱く、ConcurrentModificationExceptionがスローされることはなく、反復の進行中に発生するセットへの変更の影響が表示される場合と表示されない場合があります。
EnumSet
以下のように使用できます
import java.util.EnumSet;
public enum Direction {
LEFT,
RIGHT,
ABOVE,
BELOW;
private static EnumSet<Direction> someDirection = EnumSet.of(Direction.LEFT,Direction.RIGHT) ;
}
これで、equalsを使用していてEnumSet
、Hashcodeメソッドがデフォルトで提供され、そこからAbstractSet
の親クラスであるEnumSet
ため、それらを気にする必要はありません。