0

我需要在某个 A 类中实现 equals 方法。A 类有一个 Enum 类型的排序器集合,我想要实现的行为是,对于集合中具有完全相同 Enum 值的 A 类的两个实例,equals 返回 true (在集合的完全相同的位置)。

由于我是 java 新手,我遇到了问题,而且我不知道如何正确实现 equals 或 hashcode 方法,所以任何帮助都会很好:)

4

3 回答 3

1

如果您使用的是 eclipse(netbeans 具有类似的功能,大多数 java IDE 也是如此),您可以简单地进入“Source”菜单,然后选择“Generate hashcode() and 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;
   }


}
于 2012-08-17T15:03:50.303 回答
0

被覆盖的 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) 为真

对称- 如果 x.equals(y) 则 y.equals(x)

传递- 如果 x.equals(y) 和 y.equals(z) 则 x.equals(z)

一致- 如果 x.equals(y) 为真,则它始终为真,除非对象被修改

null - x.equals(null) 为假

此外,如果两个对象基于 equals 方法相等,则它们必须具有相同的哈希码。

反过来是不正确的。如果两个对象不相等,它们可能有也可能没有相同的哈希码

于 2012-08-17T15:03:34.100 回答
0

使用EnumSet它也根据 java 文档保留自然顺序,并且仅针对 Enums 进行了优化。

iteratormethod 返回的迭代器以元素的自然顺序(声明枚举常量的顺序)遍历元素。返回的迭代器是弱一致的:它永远不会抛出 ConcurrentModificationException 并且它可能会或可能不会显示迭代正在进行时对集合进行的任何修改的影响。

您可以使用EnumSet如下

import java.util.EnumSet;

public enum Direction {
LEFT,
RIGHT,
ABOVE,
BELOW;

private static EnumSet<Direction> someDirection = EnumSet.of(Direction.LEFT,Direction.RIGHT) ;
}

现在因为您使用的是EnumSetequals 并且 Hashcode 方法将被提供默认来自AbstractSet哪个是父类EnumSet 所以您不必关心它们。

于 2012-08-17T15:29:27.073 回答