Writing hashcode
and equals
可能很乏味和/或容易出错,而 Eclipse 等 IDE 实际上可以为您自动执行此任务。有许多第三方库也可以促进此功能。
要使用标准库中的某些内容,我建议执行以下操作:
import java.util.Arrays;
// conveniently packs varargs to array
private static Object[] pack(Object... objs) {
return objs;
}
private Object[] fieldsAsArray() {
return pack(srcAddr, dstAddr, protocol, srcPort, dstPort);
}
@Override public int hashCode() {
return Arrays.hashCode(this.fieldsAsArray());
}
@Override public boolean equals(Object o) {
// TODO: instanceof check, cast and assign o to other
return Arrays.equals(this.fieldsAsArray(), other.fieldsAsArray());
}
这使用varargs, 自动装箱, and java.util.Arrays数组的相等性和哈希码的实用方法实现。这将具有足够的(尽管可能不是最佳的)性能,但代码简洁且可读,并且可以在必要时随时进行优化。
第三方库选项
From 阿帕奇公共语言, 您可以使用EqualsBuilder and HashCodeBuilder.
该文档有典型用法的示例:
@Override public boolean equals(Object obj) {
if (obj == null) { return false; }
if (obj == this) { return true; }
if (obj.getClass() != this.getClass()) {
return false;
}
MyClass other = (MyClass) obj;
return new EqualsBuilder()
.appendSuper(super.equals(obj))
.append(field1, other.field1)
.append(field2, other.field2)
.append(field3, other.field3)
.isEquals();
}
@Override public int hashCode() {
return new HashCodeBuilder(17, 37)
.append(field1)
.append(field2)
.append(field3)
.toHashCode();
}
生成的代码非常可读、易于维护并且不易出错。
相关问题
- 在 Java 中重写 equals 和 hashCode