Реализация хэш-кода 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());
    }
Другие вопросы по тегам