如何正确使用Java实现的equals(How to properly implement equa

2019-07-31 01:18发布

我需要实现equals方法在一些A类A类具有枚举类型的订货收集,我想才达到的行为是等于该集合中具有完全相同的枚举值返回true,对A类的两个实例(在完全收集的相同位置)。

由于我是新来的Java,我有这个问题,我不知道如何正确地实现equals或hashCode方法,所以任何帮助将是不错的:)

Answer 1:

如果您使用的Eclipse版本(NetBeans也有类似的功能,如大多数的Java IDE),你可以简单地到了“源”菜单,然后选择“生成hashCode()和equals()方法”。 然后,你选择要考虑(在你的情况下,枚举值的列表中的字段。

话虽这么说,假设你已经有了枚举,这里的日食为我生成的代码。 这并不是说哈希码通常涉及质数,以及乘法和加法。 这往往给你值多少有些像样的分布。

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;
   }


}


Answer 2:

重写的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} 

从拉的javadoc ,你的equals方法必须符合以下条件:

反思 - x.equals(x)为真

对称 -如果x.equals(Y)然后y.equals(x)的

传递 -如果x.equals(Y)并且y.equals(z)的那么x.equals(z)的

一致 -如果x.equals(y)为真,那么除非对象被修改,总是真

- x.equals(空)是假的

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

相反的是不正确的。 如果两个对象不相等,它们可以或可以不具有相同的散列码



Answer 3:

使用EnumSet它保留自然顺序按照Java文档也和它仅枚举优化。

由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) ;
}

现在,因为你使用EnumSet equals和hashCode方法将提供从默认AbstractSet这是父类的EnumSet所以你不必关心他们。



文章来源: How to properly implement equals in Java