как я должен вызвать super.hashcode с помощью Google Guava hashCode () - PullRequest
1 голос
/ 27 марта 2012
public abstract class HolidayPackageVariant {
private HolidayPackage holidayPackage;
private String typeHolidayPackage;

@Override
    public int hashCode() {
        return Objects.hashCode(getTypeHolidayPackage(), getHolidayPackage());
    }
}

public final class FlightHolidayPackageVariant extends HolidayPackageVariant{
private Destination originCity;

@Override
    public int hashCode() {
        // need to add super.hashCode() here somehow ?
        return Objects.hashCode(getOriginCity() );
    }
}

Google guava hashode (): Objects.hashCode работает с объектами-членами.Как мне указать суперкласс hashCode () в производной :: hashCode ()?Я могу напрямую использовать super.members в функции производного класса hashCode (), но если super.hashCode () изменится каким-либо образом, это не будет отражено в производном: hashCode (...).

Ответы [ 3 ]

8 голосов
/ 27 марта 2012

Извините за отсутствие ответа, но: это, вероятно, не совсем то, что вы хотите сделать. Эффективная Java долго исследует, почему создание подкласса типа значения для добавления дополнительного компонента значения - плохая идея.Во втором издании, это пункт 8, «Соблюдайте общий контракт, когда переопределение равно».Также см. Пункт 16 «Пользу композиции над наследованием».

5 голосов
/ 27 марта 2012

Хеш-код сам по себе является объектом (автоматически упакованным Integer), поэтому просто включите super.hashCode() в объекты, составляющие хэш:

public int hashCode() {
    return Objects.hashCode(getOriginCity(), super.hashCode());
}
0 голосов
/ 06 июля 2013

В вашем классе есть только один новый элемент данных, поэтому нет необходимости использовать Objects.hashCode(Object...).Попробуйте вместо этого:

public int hashCode() {
    Destination oc = getOriginCity();
    return 31 * super.hashCode() + (null == oc ? 0 : oc.hashCode());
}

Если у вас много новых элементов данных в подклассе, будет работать что-то подобное:

public int hashCode() {
    return 31 * super.hashCode() + Objects.hashCode(getOriginCity(), getOtherData(), getMoreData());
}
...