如何在java中正确覆盖equals继承? [英] how do I correctly override equals for inheritance in java?

查看:114
本文介绍了如何在java中正确覆盖equals继承?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using hibernate and id... is used for persistence (which is why it is omitted in comparison). (Also, using google guava helper equals)

HolidayPackageVariant:

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:

FlightHolidayPackageVariant:

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

应该我完全覆盖了equals()或者我应该以某种方式调用super.equals(...)?

Should I completely override the equals() or should I be invoking super.equals(...) in some way ?

推荐答案

这个你应该如何实现数据对象:不允许继承,仅限组合。

This is how you should implement data objects: no inheritance allowed, composition only.

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

These are immutable objects, but you could want to modify them, so remove final where needed. Also you may remove final from the class definition because Hibernate doesn't support it, but in that case, you should document that these classes are not eligible for inheritance.

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

The main advantages are all the ones described in Effective Java plus, in this case, you don't have to manage inheritance through Hibernate which can sometimes be a real pain.

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);
  }
}

这篇关于如何在java中正确覆盖equals继承?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆