重写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继承一个)。如果您只想在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();
}

编辑(回应评论):

我的要求是,首先我需要根据"name"检查equals属性Sample的属性。如果名称相等,则两个对象都相等。如果名称不相等,那么我需要根据"ID"检查是否相等Sample的属性。我该怎么做?谢谢

应在Sample中通过重写equals()来确定Samples是否等效。如果Sampleequals()基于nameid,那么你就没事了。如果您想以不同于正常比较的方式比较B中的Samples,那么如果您从Sample中使用hashCode()equals(),您将无法维护equals()hashCode()之间的B合同,这意味着您的hashCode()equals()对于B应该是不可从Sample调用equals()hashCode()。有关如何基于特定字段进行替代的信息,请参见本教程。

最新更新