加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 继承 – 在子类中使用super.equals(),它覆盖在超类的equ

发布时间:2020-12-15 04:15:45 所属栏目:Java 来源:网络整理
导读:我一直在测试代码并偶然发现了一个问题:你应该调用子类中的super.equals()方法,它可以覆盖超类的equals()方法中使用的一些方法吗? 我们考虑以下代码: public abstract class Item { private int id; private float price; public Item(int id,String name
我一直在测试代码并偶然发现了一个问题:你应该调用子类中的super.equals()方法,它可以覆盖超类的equals()方法中使用的一些方法吗?

我们考虑以下代码:

public abstract class Item {
    private int id;
    private float price;

    public Item(int id,String name,float price,String category) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.category = category;
    }

    public int getID() {
        return id;
    }

    public float getPrice() {
        return price;
    }

    @Override
    public boolean equals(Object object){
        if(object instanceof Item){
            Item item = (Item) object;
            if( id == item.getID()
                && price == item.getPrice())                    
            { return true; }
        }
        return false;
    }
}

而子类DiscountedItem:

public class DiscountedItem extends Item {
    // discount stored in %
    private int discount;

    @Override
    public boolean equals(Object object) {
        if(object instanceof DiscountedItem){
            DiscountedItem item = (DiscountedItem) object;
            return (super.equals(item)
                    && discount == item.getDiscount()
            );
        }
        return false;
    }

    public int getDiscount() {
        return discount;
    }

    @Override
    public float getPrice() {
        return super.getPrice()*(100 - discount);
    }    
}

我一直只是重读Angelika Langer’s secrets of equals(),她甚至说:

There is agreement that super.equals() should be invoked if the class has a superclass other than Object.

但是,当子类覆盖某些方法时,我认为这是非常不可预测的.例如,当我使用equals比较2个DiscountedItem对象时,调用super方法并将item.getPrice()动态调度到子类DiscountedItem中的正确方法,而使用变量直接访问其他价格值.

那么,这真的取决于我(因为我应该正确地实现该方法)还是有办法绕过它?

解决方法

直接比较实例变量,而不是将实例变量与其相关的getter方法进行比较.

例如,改变

&& price == item.getPrice())

&& this.price == item.price)

getter方法是不必要的,因为私有实例变量只能在类结构之外访问.

注意:

我之前推荐过以下内容:

&& this.getPrice() == item.getPrice())

虽然它可以在问题的例子中起作用,但并不适合所有情况.考虑子类DiscountedItem是否如此声明方法getPrice:

@Override
public float getPrice() {
    return Math.floor(super.getPrice());
}

这会导致错误的等价:

DiscountedItem firstItem = DiscountedItem(1,"",1.1,"");
DiscountedItem secondItem = DiscountedItem(1,1.0,"");
firstItem.equals(secondItem); // Returns true despite different prices.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读