我需要实现equals方法在一些A类A类具有枚举类型的订货收集,我想才达到的行为是等于该集合中具有完全相同的枚举值返回true,对A类的两个实例(在完全收集的相同位置)。
由于我是新来的Java,我有这个问题,我不知道如何正确地实现equals或hashCode方法,所以任何帮助将是不错的:)
我需要实现equals方法在一些A类A类具有枚举类型的订货收集,我想才达到的行为是等于该集合中具有完全相同的枚举值返回true,对A类的两个实例(在完全收集的相同位置)。
由于我是新来的Java,我有这个问题,我不知道如何正确地实现equals或hashCode方法,所以任何帮助将是不错的:)
如果您使用的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;
}
}
重写的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方法,它们必须具有相同的散列码。
相反的是不正确的。 如果两个对象不相等,它们可以或可以不具有相同的散列码
使用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
所以你不必关心他们。