覆盖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. }
当我尝试在B类中重写equals()和hashCode()时,我在Eclipse中得到了以下错误。
字段类型com.mypackage.Sample未实现hashCode()和equals() – 生成的代码可能无法正常工作。
现在,我如何基于Sample属性比较两个B实例是否等于? 我无法修改Sample类。
你看起来像下面的东西? 试试吧,从您的问题来看,我认为您也希望比较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)); }
如果你没有显式覆盖.equals()
,它们将仅基于它们的引用进行比较(尽管没有equals()
,每个对象都从Object
inheritance)。 如果您只想基于Sample
比较B
,那么只需执行以下操作:
@Override public boolean equals(Object o) { if (o istanceof B) { return sample.equals(o.sample) } return false; }
此外,您应该覆盖hashCode()
(和compareTo()
)以维护equals()
和hashCode()
之间的契约 。 因此,您还应该具备以下条件:
@Override public int hashCode() { return sample.hashCode(); }
编辑(回应评论):
我的要求是首先我需要检查Sample的“name”属性的equals属性。 如果IF名称相等则两个对象都相等。 如果名称不等于那么我需要检查Sample与“ID”属性的相等性。 我怎样才能做到这一点? 谢谢!
确定Samples
是否等效应通过覆盖equals()
在Sample
处理。 如果Sample
基于name
和id
equals()
,那么你没事。 如果你想比较B
Samples
而不是通常比较它们,那么如果你使用Sample
hashCode()
或equals()
,那么你将无法维持B
equals()
和hashCode()
之间的契约。 ,这意味着你的hashCode()
和equals()
应该不能从Sample
调用equals()
或hashCode()
。 有关如何根据特定字段覆盖,请参阅本教程 。