我应该如何使用google guava hashCode()调用super.hashcode

时间:2012-03-27 12:05:51

标签: java hash guava hashcode

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适用于成员对象。如何在derived :: hashCode()中指定超类hashCode()?我可以在派生类hashCode()函数中直接使用super.members,但是如果super.hashCode()以任何方式更改,那么这将不会反映在derived:hashCode(...)中。

3 个答案:

答案 0 :(得分:8)

很抱歉没有回答但是:这可能不是你想要做的。 Effective Java 长期探索为什么子类化值类型以添加​​额外的值组件是一个坏主意。在第二版中,它是第8项,“当压倒平等时遵守一般合同”。另见第16项“赞成继承继承。”

答案 1 :(得分:5)

哈希码本身就是一个(自动装箱的Integer)对象,所以只需在构成哈希的对象中包含super.hashCode()

public int hashCode() {
    return Objects.hashCode(getOriginCity(), super.hashCode());
}

答案 2 :(得分:0)

您的班级只有一个新的数据成员,因此无需使用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());
}