簡體   English   中英

如何在 Java 中測試子類的相等性?

[英]How to test the child class for equality in Java?

我正在做一個項目,但我遇到了一些問題。 我需要測試子類(DiscountProduct)的相等性。 類之間的關系可以理解為:Order 類 has-a 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)規則錯誤,您if a.equals(b) then b.equals(a)可能會得到必要的結果
  • 那么你想重用父類的現有實現
  • 最后,比較子類字段

equals() “最后”版本聲明為final可能是有意義的,但這實際上取決於上下文。

在這部分代碼中:

public class Order implements Comparable<Order>{
    ...
    public boolean equals(Object obj){
        if (obj instanceof Order) {
            return product.equals(obj) && ...;
        }
        ...
    }
}

ProductOrder相伴。 這種比較顯然應該返回false因為Product不是Order 你可能想寫的是:

返回 product.equals(obj.product) && ...;

對您的代碼的評論: Object::equalsObject::hashCode之間有一個約定

hashCode的總合約為:

  • 在 Java 應用程序執行期間,只要在同一個對象上多次調用它, hashCode方法必須始終返回相同的整數,前提是在對象的equals比較中使用的信息沒有被修改。 該整數不需要從應用程序的一次執行到同一應用程序的另一次執行保持一致。

  • 如果根據equals(Object)方法兩個對象相等,則對兩個對象中的每一個調用hashCode方法必須產生相同的整數結果。

  • 如果根據equals(java.lang.Object)方法兩個對象不相等,則不需要對兩個對象中的每一個調用hashCode方法必須產生不同的整數結果。 但是,程序員應該意識到為不相等的對象生成不同的整數結果可能會提高哈希表的性能。

為了符合這個契約,當一個覆蓋equals(...)時,一個人應該總是覆蓋hashCode() equals(...)

我還鼓勵您設置方法equals(...)hashCode() final 否則,可能會違反equals(...)約定

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM