Запись hashcode
и equals
может быть утомительной и / или подверженной ошибкам, и IDE, такие как Eclipse, могут фактически автоматизировать эту задачу для вас. Есть много сторонних библиотек, которые могут облегчить эту функцию.
Чтобы использовать что-то из стандартной библиотеки, я рекомендую сделать следующее:
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 , autoboxing и java.util.Arrays
реализация служебного метода для равенства и хэш-кода массивов. Это будет иметь адекватную (хотя, возможно, не оптимальную) производительность, но код будет лаконичным и читаемым, и его всегда можно будет оптимизировать позже, если / когда это будет необходимо.
Опции сторонней библиотеки
С Apache Commons Lang , вы можете использовать EqualsBuilder
и 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();
}
Полученный код очень удобочитаемый, легко обслуживаемый и менее подвержен ошибкам.
Похожие вопросы