2016-03-09 66 views
0

是否有可能比較類,它包含一些其他類的實例,不包含的hashCode和equals與無的hashCode類實例的比較級和等於

我們有3類:Car.java,SUV.java和TestFinal的.java

Car.java(沒有簡單的hashCode POJO和equals)

public class Car 
{ 
    private long carId; 
    private String manufacturer; 

    public Car(long carId, String manufacturer) 
    { 
    super(); 
    this.carId = carId; 
    this.manufacturer = manufacturer; 
    } 

    /** 
    * @return The carId. 
    */ 
    public long getCarId() 
    { 
     return carId; 
    } 

    /** 
    * @param carId The carId to set. 
    */ 
    public void setCarId(long carId) 
    { 
     this.carId = carId; 
    } 

    /** 
    * @return The manufacturer. 
    */ 
    public String getManufacturer() 
    { 
     return manufacturer; 
    } 

    /** 
    * @param manufacturer The manufacturer to set. 
    */ 
    public void setManufacturer(String manufacturer) 
    { 
     this.manufacturer = manufacturer; 
    } 
} 

SUV.java(含汽車的實例,包含的hashCode和equals)

public class SUV { 
    private Car car; 

    /** 
    * @return The car. 
    */ 
    public Car getCar() 
    { 
     return car; 
    } 

    /** 
    * @param car The car to set. 
    */ 
    public void setCar(Car car) 
    { 
     this.car = car; 
    } 

    public SUV(Car car) 
    { 
     super(); 
     this.car = car; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public int hashCode() 
    { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((car == null) ? 0 : car.hashCode()); 
     return result; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public boolean equals(Object obj) 
    { 
     if (this == obj) 
     { 
      return true; 
     } 
     if (obj == null) 
     { 
      return false; 
     } 
     if (getClass() != obj.getClass()) 
     { 
      return false; 
     } 
     SUV other = (SUV) obj; 
     if (car == null) 
     { 
      if (other.car != null) 
      { 
       return false; 
      } 
     } 
     else if (!car.equals(other.car)) 
     { 
      return false; 
     } 
     return true; 
    } } 

TestFinal是主類,在這裏我比較兩個SUV對象

public class TestFinal 
{ 
    public static void main(String args[]) 
    { 
     Car car1 = new Car(1, "Toyota"); 
     Car car2 = new Car(1, "Toyota"); 

     SUV suv1 = new SUV(car1); 
     SUV suv2 = new SUV(car2); 

     System.out.println(suv1.equals(suv2)); 
    } 
} 

這裏

suv1.equals(SUV2)

返回false,因爲車不包含重寫equals和hashCode。有沒有辦法,我可以更新我的SUV纔是硬道理邏輯無需在汽車的變化(如添加equals和hashCode),使得

suv1.equals(SUV2)

返回true

任何投入或建議將是有價值的。

謝謝!

+1

我想你可以創建包裝類,會覆蓋這些方法,有些在裝飾設計模式爲一體的方式來解決這個問題,但我認爲這將有助於我們理解這個請求背後的動機 - 爲什麼不重寫hashCode和equals,這將是處理這種事情的常用方法? –

回答

0

使用比較也界面如下無疑等於:

進口的java.util.Comparator;

公共類CarComparator實現比較{

@Override 
public int compare(Car o1, Car o2) { 
    if(o1 == null || o2 == null){ 
     return -1; 
    } else if(o1!=null && o2 == null){ 
     return -1; 
    } else if(o1==null && o2!=null){ 
     return -1; 
    } else{ 
     if(o1.getCarId() == o2.getCarId() && o1.getManufacturer().equals(o2.getManufacturer())){ 
      return 0; 
     } else { 
      return -1; 
     } 
    } 

} 

}

然後,對於SUV類:

包test.corejava.concepts;

公共級SUV私家車汽車;

/** 
* @return The car. 
*/ 
public Car getCar() { 
    return car; 
} 

/** 
* @param car 
*   The car to set. 
*/ 
public void setCar(Car car) { 
    this.car = car; 
} 

public SUV(Car car) { 
    super(); 
    this.car = car; 
} 

/** 
* {@inheritDoc} 
*/ 
@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((car == null) ? 0 : car.hashCode()); 
    return result; 
} 

/** 
* {@inheritDoc} 
*/ 
@Override 
public boolean equals(Object obj) { 
    if (this == obj) { 
     return true; 
    } 
    if (obj == null) { 
     return false; 
    } 
    if (getClass() != obj.getClass()) { 
     return false; 
    } 
    SUV other = (SUV) obj; 
    if (car == null) { 
     if (other.car != null) { 
      return false; 
     } 
    } else if (new CarComparator().compare(car, other.car)!=0) { 
     return false; 
    } 
    return true; 
} 

}

希望,這有助於....

0

對於equals邏輯,您可以使用非常醜陋的解決方法:手動比較組成兩個SUV對象的Car對象的相關屬性。

本質:

if (other.car.getManufacturer().equals(car.getManufacturer()))

我仍然會強烈建議不要說 - 別說你會用hashCode獲得的麻煩!

可能適應的另一種方式是實現SUV的時候,除去比較Car S作爲相關條款都equalshashCode,並決定2個SUV S之間平等是不是由他們Car小號的影響。

最後:不應SUVCar,而不是Car

0

有沒有辦法,我可以更新我的SUV纔是硬道理邏輯未做汽車 變化(如添加equals和hashCode)

不是真的,因爲在你的SUV.equals()方法,你有

else if (!car.equals(other.car)) 
{ 
    return false; 
} 

而且由於car.equals()未被覆蓋,所以它使用Object.equals(),它簡單地比較實例相等的對象。

那麼,你可以用car分別比較每個字段來代替該代碼,但是你真的想這樣做嗎?它很醜。最好只是覆蓋Car.equals()

0

我已經更新了類「SUV」,我不說這是理想的方法,但一個解決辦法...

public class SUV { 
    private Car car; 

    /** 
    * @return The car. 
    */ 
    public Car getCar() { 
     return car; 
    } 

    /** 
    * @param car 
    *   The car to set. 
    */ 
    public void setCar(Car car) { 
     this.car = car; 
    } 

    public SUV(Car car) { 
     super(); 
     this.car = car; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((car == null) ? 0 : car.hashCode()); 
     return result; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) { 
      return true; 
     } 
     if (obj == null) { 
      return false; 
     } 
     if (getClass() != obj.getClass()) { 
      return false; 
     } 
     SUV other = (SUV) obj; 
     if (car == null) { 
      if (other.car != null) { 
       return false; 
      } 
     } else if (!carEquals(car, other.car)) { 
      return false; 
     } 
     return true; 
    } 

    private boolean carEquals(Car firstObj, Car otherObj){ 


     if(otherObj == null){ 
      return false; 
     } else{ 
      if(firstObj.getCarId() == otherObj.getCarId() && firstObj.getManufacturer().equals(otherObj.getManufacturer())){ 
       return true; 
      } else { 
       return false; 
      } 
     } 

    } 
} 
0

你可以有你的SUV類實現可比接口,然後寫你自己的邏輯在您的方法compareTo(T o)的實現中比較SUV您還可以創建一個實現Comapartor接口的類,將SUV與自己的邏輯進行比較。請閱讀Javadoc:ComparableComparator。但它是一個醜陋的解決辦法和實施哈希碼,並通過更爲preferrable