如何在java中正确覆盖equalsinheritance?

我正在使用hibernate和id …用于持久性(这就是为什么它在比较中被省略)。 (另外,使用google guava helper equals)

HolidayPackageVariant:

public abstract class HolidayPackageVariant { private Integer idHolidayPackageVariant; private HolidayPackage holidayPackage; private String typeHolidayPackage; @Override public boolean equals(Object obj) { if (obj == this) return true; if(obj == null) return false; if (getClass().equals(obj.getClass())) { final HolidayPackageVariant otherPackageVariant = (HolidayPackageVariant) obj; return Objects.equal(getTypeHolidayPackage(),otherPackageVariant.getTypeHolidayPackage()) && Objects.equal(getHolidayPackage(), otherPackageVariant.getHolidayPackage()); } return false; } @Override public int hashCode() { return Objects.hashCode(getTypeHolidayPackage(), getHolidayPackage()); } 

FlightHolidayPackageVariant:

 public final class FlightHolidayPackageVariant extends HolidayPackageVariant{ private Destination originCity; public boolean equals(Object obj) { // .. 

我应该完全覆盖equals()还是应该以某种方式调用super.equals(…)?

这是您应该如何实现数据对象:不允许inheritance,仅限组合。

这些是不可变对象,但您可能想要修改它们,因此在需要的地方删除final 。 你也可以从类定义中删除final ,因为Hibernate不支持它,但在这种情况下,你应该记录这些类不符合inheritance的条件。

主要优点是Effective Java plus中描述的所有优点,在这种情况下,您不必通过Hibernate管理inheritance,这有时可能是一个真正的痛苦。

 public final class HolidayPackageVariant { private final Integer idHolidayPackageVariant; private final HolidayPackage holidayPackage; private final String typeHolidayPackage; ... @Override public boolean equals(Object obj) { if (obj == this) return true; if (!(obj instanceof HolidayPackageVariant)) return false; HolidayPackageVariant that = (HolidayPackageVariant) obj; return Objects.equal(this.typeHolidayPackage, that.typeHolidayPackage) && Objects.equal(this.holidayPackage, that.holidayPackage); } @Override public int hashCode() { return Objects.hashCode(this.typeHolidayPackage, this.holidayPackage); } } public final class FlightHolidayPackageVariant { private HolidayPackageVariant holidayPackageVariant; private Destination originCity; ... public HolidayPackageVariant asHolidayPackageVariant() { return this.holidayPackageVariant; } public boolean equals(Object obj) { if (obj == this) return true; if (!(obj instanceof FlightHolidayPackageVariant)) return false; FlightHolidayPackageVariant that = (FlightHolidayPackageVariant) obj; return Objects.equal(this.holidayPackageVariant, that.holidayPackageVariant) && Objects.equal(this.originCity, that.originCity); } @Override public int hashCode() { return Objects.hashCode(this.holidayPackageVariant, this.originCity); } } 

遵循平等的秘密 :

HolidayPackageVariant:

 public abstract class HolidayPackageVariant { private Integer idHolidayPackageVariant; private HolidayPackage holidayPackage; private String typeHolidayPackage; @Override public boolean equals(Object obj) { if (obj == this) return true; if(obj == null) return false; if (getClass().equals(obj.getClass())) { final HolidayPackageVariant otherPackageVariant = (HolidayPackageVariant) obj; return Objects.equal(getTypeHolidayPackage(),otherPackageVariant.getTypeHolidayPackage()) && Objects.equal(getHolidayPackage(), otherPackageVariant.getHolidayPackage()); } return false; } } 

FlightHolidayPackageVariant:

 public final class FlightHolidayPackageVariant extends HolidayPackageVariant{ private Destination originCity; @Override public boolean equals(Object obj) { if(super.equals(obj)){ return Objects.equal(getOriginCity(), ((FlightHolidayPackageVariant)(obj)).getOriginCity()); } return false; } } 

这将确保只有相同类型的变体彼此相同。