Реализация хэш-кода Java с несколькими равными
Из того, что я знаю, каждый объект equals должен иметь один и тот же хэш-код. Однако что делать, если в методе equals есть несколько, если это необходимо соблюдать?
Местоположение - это объект, Junction - это объект, длина - это целое число, смещение - это целое число, раздел - это объект.
Я уже решил тот, когда в методе atAJunction, хэш-код, который я использовал только в качестве дополнительного хеш-кода. И когда Раздел равен, длина его раздела равна смещению обоих местоположений. Хэш-код, который я использовал для этого, использует только раздел в качестве хэш-кода.
Основная проблема заключается в том, что они имеют разные секции, но одинаковое смещение и конечную точку. это равно, но хеш-код отличается.
Кто-нибудь может помочь с моей проблемой? Спасибо, прежде чем.:)
Это мой метод Equals:
@Override
public boolean equals(Object object) {
if(object == null){
return false;
}
if(!(object instanceof Location)){
return false;
}else{
Location otherLocation = (Location) object;
if(atAJunction() && otherLocation.atAJunction()){
return this.endPoint.getJunction().equals(otherLocation.getEndPoint().getJunction());
}else{
// The Problem Here
if(this.endPoint.equals(otherLocation.endPoint)){
return this.offset == otherLocation.getOffset();
}else{
return this.section.equals(otherLocation.getSection()) &&
this.section.getLength() == (this.offset + otherLocation.getOffset());
}
}
}
}
И это мой хэш-код:
@Override
public int hashCode() {
// creates a polynomial hash-code based on the fields of the class.
final int prime = 13; // an odd base prime
int result = 1; // the hash code under construction
if(atAJunction()){
result = prime * result + this.endPoint.getJunction().hashCode();
}else{
result = prime * result + this.section.hashCode();
}
return result;
}
2 ответа
Во-первых, я не понимаю, зачем вам эта дополнительная проверка?
return this.section.equals(otherLocation.getSection()) &&
**this.section.getLength() == (this.offset + otherLocation.getOffset());**
В идеале, если секции равны, тогда длина и все должны быть уже охвачены в нем. Сравнение внутреннего значения одного объекта с некоторым производным значением другого класса подвержено ошибкам, и его следует избегать в методах, подобных equals().
Вы можете посмотреть на эту книгу, http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683. Здесь автор объясняет отношение в хеш-коде и равнозначно. Это было бы определенно полезно для вас.
В вашем случае я хотел бы предложить следующее: если вы не совсем понимаете, как правильно генерировать hashcode() и equals(), попробуйте использовать генераторы кода, встроенные в IDE, такие как Eclipse или netbeans.
Пожалуйста, посетите другой ресурс For Ex. ниже.
public class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
// ...
}
Чем вы создаете Equals и HashCode, как в Effective Java
// A better definition, but still not perfect
@Override public boolean equals(Object other) {
boolean result = false;
if (other instanceof Point) {
Point that = (Point) other;
result = (this.getX() == that.getX() && this.getY() == that.getY());
}
return result;
}
@Override public int hashCode() {
return (41 * (41 + getX()) + getY());
}