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(...)中。
答案 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());
}