编程语言
首页 > 编程语言> > java-处理继承时覆盖equals方法

java-处理继承时覆盖equals方法

作者:互联网

我一直在阅读有关在处理子类时如何最好地覆盖equals方法的信息,在这里我发现了很多文章.他们推荐了使用instanceof或getClass()比较不同子类的对象来实现解决方案的不同方法.

但是,对于有效Java而言,我的理解是(而且我是新来的,所以我很可能错了!)布洛赫认为,最后两者都可能是有问题的,“没有办法扩展可实例化的类并添加值.组件,同时保留平等契约,除非您愿意放弃面向对象抽象的好处”.然后建议“赞成组成而不是继承”.

因此,我正在处理以下类层次结构:AbstractClass,ConcreteClass1和ConcreteClass2. ConcreteClass1扩展了AbstractClass,而ConcreteClass2扩展了ConcreteClass1.目前,只有AbstractClass覆盖equals方法.

所以在AbstractClass中:

public abstract class AbstractClass {
        private String id;


        public boolean equals(Object other) {
            return other != null && other.getClass().equals(getClass())
                    && id.equals(((AbstractClass) other).id);
        }

    }

在ConcreteClass1中,我有:

public class ConcreteClassOne extends AbstractClass
{
  private final AbstractClass parent;

  public ConcreteClassOne( String anId, AbstractClass aParent )
  {
    super( anId );

    parent = aParent;
  }

}

最后在ConcreteClassTwo中,我有:

public class ConcreteClassTwo extends ConcreteClassOne
{
  private static int nextTrackingNo = 0;

  private final int trackingNo;

  public ConcreteClassTwo ( String anId )
  {
    super( anId, null );

    trackingNo= getNextTrackingNo();
  }
}

因此,我相信我需要在ConcreteClassOne和ConcreteClassTwo中都覆盖equals方法,以包括有效字段parent和trackingNo.我不允许更改设计,因此不能使用合成.有什么建议么?

解决方法:

最简单的方法是在具体类和抽象类中都扩展equals().

public class ConcreteClassTwo extends ConcreteClassOne {
    public boolean equals(Object other) {
        boolean rv = super.equals( other );
        if ( other instanceof ConcreteClassTwo ) {
           rv = rv && (this.trackingNo == ((ConcreteClassTwo) other).trackingNo);
        }
        return rv;
    }
}

标签:java,abstraction,equals,inheritance,overriding
来源: https://codeday.me/bug/20191011/1891807.html