java - Java中如何测试子类的相等性?

标签 java equals comparator

我正在开发一个项目,但遇到了一些问题。我需要测试子类(DiscountProduct)的相等性。 类之间的关系可以理解为:Order 类有一个 Product,Product 是 DiscountProduct 的父级。我想测试 DiscountProduct 是否相等。任何帮助深表感谢。谢谢你! 下面是代码:

订单类别:

public class Order implements Comparable<Order>{

    private int quantity;
    //composition has-a relationship
    private Product product;

    public Order(int quantity, Product product) {
        this.quantity = quantity;
        this.product = product;
    }

    public boolean equals(Object obj){
        if (obj instanceof Order) {
            return product.equals(obj) && quantity == ((Order) obj).quantity;
        }
        return false;
    }

    public Product getProduct() {
        return product;
    }
}

产品类别

public class Product implements Comparable<Product> {

    private String productCode;
    private String description;
    private int unitPrice; //pence

    public Product(String productCode, String description, int unitPrice) {
        this.productCode = productCode;
        this.description = description;
        this.unitPrice = unitPrice;
    }

    //equals method to test product for equality.
    public boolean equals(Object obj){
        if (this == obj){
            return true;
        }
        if (obj == null || !(obj instanceof Product)){
            System.out.println("-");

            return false;
        }
        Order other = (Order) obj;
        if (!productCode.equals(other.getProduct().getProductCode()))
            return false;
        if (!description.equals(other.getProduct().getDescription()))
            return false;        
        if (unitPrice != (other.getProduct().getUnitPrice()))
            return false;
        return true;
    }
}

折扣产品类别

public class DiscountProduct extends Product {

    private double discountRate;

    public DiscountProduct(String productCode, String description, int unitPrice, double discountRate) {
        super(productCode, description, unitPrice);
        this.discountRate = discountRate;
    }

    //equals method to test discount product for equality.
    public boolean equals(Object obj){
        Order other = (Order) obj;
       //how to test for the equality for the discountProduct's field discountRate?
       //does I need to add some method in Order class to get the discountRate of object of Order class, 
       //because relation is 'Order has Product' and then there is a parent-child relation
       //between product and DiscountProduct class. 

    }
}

最佳答案

DiscountProduct 可以执行以下操作:

@Override // always always always use that annotation when overriding!
public boolean equals(Object obj){
  .. this == obj test
  if (obj == null || !(obj instanceof DiscountProduct)){
    return false;
  } 
  if (super.equals(obj)) {
    cast to DiscountProduct and check discountRate

这里的要点是:

  • 您确实希望同一类的对象相等。否则,您很有可能得到必要的 if a.equals(b) then b.equals(a) 规则错误
  • 那么你想重用父类的现有实现
  • 最后,比较子类字段

equals() 的“最后”版本声明为 final 也可能有意义,但这实际上取决于上下文.

关于java - Java中如何测试子类的相等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59530424/

相关文章:

java - 使用斯坦福自然语言处理分类器进行分词的文本分类器

java - 主键的单独实体

java - 在 Spring Boot 服务上运行有限数量的线程

java - 以这种方式覆盖 `equals()` 有什么缺点?

java - Java 可以帮助我避免 equals() 中的样板代码吗?

java - String.equalsIgnoreCase - 大写与小写

java - 有没有办法返回不会做任何事情的比较器?

generics - 为什么对于具有相同模板值参数类型的比较器类型未定义 TreeMap 构造函数?

java - 为什么具有可完成 future 的代码比并行流慢?

java - 空列表的加权顺序