2013-12-10 129 views
2

我有下面的類:在java中重寫hashcode和equals方法?

public class Sample implements java.io.Serializable{ 

    //POJO with two fields and getters/setters 

    private String name; 
    private Integer id; 

    //This POJO does not override equals() and hashCode() 
} 

public class B{ 
private Sample sample; 

    //here i need override hashcode and equals() based on **sample** property. 


} 

當我試圖在類我在Eclipse中有如下錯誤忽略equals()和hashCode()。

字段類型com.mypackage.Sample未實現hashCode()和equals() - 生成的代碼可能無法正常工作。

現在如何根據Sample屬性比較兩個B實例是否等於或不等於? 我無法修改Sample類。

+2

的可能的複製[什麼會出問題的時候超不重新聲明的equals()和hashCode()?](http://stackoverflow.com/questions/ 16236708 /什麼-將-GO-錯誤的時候,超類不 - 不重新聲明,等於和 - 哈希碼)。雖然請注意,在我看來,[警告是錯誤的](http://stackoverflow.com/a/16237663/474189)。 –

+1

Eclipse是一個保姆。它代表你擔心。忽略它或將方法添加到Sample。 – bmargulies

+0

意識到比較和可比? –

回答

2

你看起來像下面的東西?試試吧,從你的問題我想你想比較你的Sample類的內容。

class Sample implements java.io.Serializable{ 

    //POJO with two fields and getters/setters 

    private String name; 
    private Integer id; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Integer getId() { 
     return id; 
    } 
    public void setId(Integer id) { 
     this.id = id; 
    } 

    //This POJO does not override equals() and hashCode() 
} 

public class Beta implements Comparable{ 
    private Sample sample; 

    public Sample getSample() { 
     return sample; 
    } 

    public void setSample(Sample sample) { 
     this.sample = sample; 
    } 

    @Override 
    public int compareTo(Object o) { 

     if(!(o instanceof Beta)){ 
      return -1; 
     } 
     }if(((Beta)o).getSample().getName().equals(this.sample.getName())){ 
       return 0; // return true if names are equal 
      } 
      if(((Beta)o).getSample().getId().equals(this.sample.getId())){ 
      //if name are notequal and IDs are equal, do what you need to do 
      } 
     return -1; 
    } 

    public static void main(String[] args) { 
     Beta b = new Beta(); 
     Sample s = new Sample(); 
     s.setId(10); 
     s.setName("Name1"); 
     b.setSample(s); 

     Beta b2 = new Beta(); 
     Sample s2 = new Sample(); 
     s2.setId(20); 
     s2.setName("Name2"); 
     b2.setSample(s2); 

     System.out.println(b2.compareTo(b)); 

     Beta b3 = new Beta(); 
     Sample s3 = new Sample(); 
     s3.setId(10); 
     s3.setName("Name1"); 
     b3.setSample(s3); 

     System.out.println(b3.compareTo(b)); 
    } 
} 

重寫方法

class Sample implements java.io.Serializable{ 

    //POJO with two fields and getters/setters 

    private String name; 
    private Integer id; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Integer getId() { 
     return id; 
    } 
    public void setId(Integer id) { 
     this.id = id; 
    } 

    //This POJO does not override equals() and hashCode() 
} 

public class Beta /*implements Comparable*/{ 
    private Sample sample; 

    public Sample getSample() { 
     return sample; 
    } 

    public void setSample(Sample sample) { 
     this.sample = sample; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == null) { 
      return false; 
     } 
     if (getClass() != obj.getClass()) { 
      return false; 
     } 
     final Beta other = (Beta) obj; 

     if ((this.getSample() == null) && (other.getSample() == null)){ 
      return true; 
     } 
     if ((this.getSample().getId().equals(other.getSample().getId())) && (this.getSample().getName().equals(other.getSample().getName()))) { 
      return true; 
     } 
     return false; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 3; 
     hash = 53 * hash + (this.getSample().getName() != null ? this.getSample().getName().hashCode() : 0); 
     hash = 53 * hash + (this.getSample().getId() != null ? this.getSample().getId().hashCode() : 0); 
     return hash; 
    } 


/* @Override 
    public int compareTo(Object o) { 

     if(!(o instanceof Beta)){ 
      return -1; 
     } 
     if(((Beta)o).getSample().getId().equals(this.sample.getId()) && ((Beta)o).getSample().getName().equals(this.sample.getName())){ 
      return 0; 
     } 
     return -1; 
    }*/ 

    public static void main(String[] args) { 
     Beta b = new Beta(); 
     Sample s = new Sample(); 
     s.setId(10); 
     s.setName("Name1"); 
     b.setSample(s); 

     Beta b2 = new Beta(); 
     Sample s2 = new Sample(); 
     s2.setId(20); 
     s2.setName("Name2"); 
     b2.setSample(s2); 

     System.out.println(b2.equals(b)); 

     Beta b3 = new Beta(); 
     Sample s3 = new Sample(); 
     s3.setId(10); 
     s3.setName("Name1"); 
     b3.setSample(s3); 

     System.out.println(b3.equals(b)); 
    } 
+0

VD,是的,這正是我正在尋找的。我的要求是首先我需要檢查樣品的「名稱」屬性的等值屬性。如果名稱相等,那麼兩個對象是相等的。如果名稱不等於那麼我需要檢查樣品的「ID」屬性的平等。我怎樣才能做到這一點?謝謝! – user755806

+0

我已經編輯了你的需求的代碼,你可以參考覆蓋的方法從http://stackoverflow.com/questions/8180430/how-to-override-equals-method-in-java –

+0

我也編輯了覆寫的代碼哈希碼和等於方法 –

1

如果您沒有明確覆蓋.equals(),將僅基於它們的引用(儘管沒有equals(),每個對象從Object繼承一個對象)進行比較。如果你只B是基於比較關閉的Sample想要的,然後只需做到以下幾點:

@Override 
public boolean equals(Object o) 
{ 
    if (o istanceof B) 
    { 
     return sample.equals(o.sample) 
    } 

    return false; 
} 

另外,你應該然後覆蓋hashCode()(和compareTo())維護和hashCode()contract之間equals()。因此,你也應該具備以下條件:

@Override 
public int hashCode() 
{ 
    return sample.hashCode(); 
} 

編輯(在響應評論):

我的要求是首先我需要檢查等於財產對「名」的 財產樣品。如果名稱相等,那麼兩個對象是相等的。 如果名稱不等於那麼我需要檢查樣品的「ID」 屬性的平等。我怎樣才能做到這一點?謝謝!

確定Samples是否相等應Sample通過重寫equals()處理。如果equals()Sample根據nameid,那麼你很好。如果你想在B比較Samples不同於它們通常比較,那麼你不會是能夠保持equals()hashCode()之間的合同B如果你使用hashCode()equals()Sample,這意味着你的hashCode()equals()對於B應該不能從Sample調用equals()hashCode()。請參閱此tutorial以瞭解如何根據特定字段進行覆蓋。

+0

我試過了。但仍然得到「字段類型com.mypackage.Sample沒有實現hashCode()和equals() - 生成的代碼可能無法正常工作」。有什麼建議麼? – user755806

+0

@ user755806這絕對有效,我相信你的IDE只是告訴你,你沒有顯式重寫'hashCode()'和'equals()'。確保你也爲'B'重寫了'hashCode()' - 我做了一個編輯,說明如何做到這一點。如果沒有這樣做,那麼你將不會維護'equals()'和'hashCode()'的合約。如果你的IDE仍然在喊你,這只是一個警告,要確保你明白'Sample'你使用了默認方法而不是重寫。 –

+0

Steve,thanx回覆。我的要求是首先我需要檢查樣品的「名稱」屬性等於財產。如果名稱相等,那麼兩個對象是相等的。如果名稱不等於那麼我需要檢查樣品的「ID」屬性的平等。我怎樣才能做到這一點?謝謝! – user755806

相關問題