在java中重写equals和hashcode方法?

在java中重写equals和hashcode方法?,java,hashcode,java-ee-7,Java,Hashcode,Java Ee 7,我有课下作业 Request.java 在EmpRequest类中,我需要基于请求对象的属性重写equals()和hashCode() 如果两个请求对象id相等,那么我需要返回true。 如果两个对象ID不相等,那么我需要检查name和hid属性。 如果两个对象的name和hid属性都相等,那么我需要返回true。 否则错误 我该怎么做?我尝试重写equals()和hashCode(),但eclipse给出了以下警告 字段类型“com.mycompany.Request”未实现equals()和

我有课下作业

Request.java 在EmpRequest类中,我需要基于请求对象的属性重写
equals()
hashCode()

如果两个请求对象id相等,那么我需要返回true。 如果两个对象ID不相等,那么我需要检查namehid属性。 如果两个对象的name和hid属性都相等,那么我需要返回true。 否则错误

我该怎么做?我尝试重写
equals()
hashCode()
,但eclipse给出了以下警告

字段类型“com.mycompany.Request”未实现
equals()
hashCode()
-生成的代码可能无法正常工作

在同一类型中,我无法修改请求类,因为我无法控制它


考虑到上述条件,如何编写
equals()
hashCode()

您可以从IDE(Eclipse,IntelliJ IDEA)生成
equals()
hashCode()
。这对于您的场景来说已经足够了

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Result)) return false;

    Result result = (Result) o;

    if (hid != null ? !hid.equals(result.hid) : result.hid != null) return false;
    if (id != null ? !id.equals(result.id) : result.id != null) return false;
    if (name != null ? !name.equals(result.name) : result.name != null) return false;

    return true;
}

@Override
public int hashCode() {
    int result = id != null ? id.hashCode() : 0;
    result = 31 * result + (name != null ? name.hashCode() : 0);
    result = 31 * result + (hid != null ? hid.hashCode() : 0);
    return result;
}
编辑:

以下是哈希代码:

@Override
public int hashCode()
{
    final int prime = 31;
    int result = 1;
    result = prime * result + ((getRequest().getId() == null) ? 0 : getRequest().getId().hashCode());
    result = prime * result + ((getRequest().getName() == null) ? 0 : getRequest().getName().hashCode());
    result = prime * result + ((getRequest().getHid() == null) ? 0 : getRequest().getHid().hashCode());
    return result;
}

@SachinPasalkar这不是答案。@SachinPasalkar当你发表评论时,你应该全神贯注。您的任何评论都需要OP的帮助。如果您没有任何意见,可以离开这里idea@SachinPasalkar我理解你的愤怒和激情,但“先读java书”充其量也是站不住脚的。@SachinPasalkar他问过教我java吗?@SachinPasalkar OP没有要求学习
java
。我认为你高估了自己。这里没有人是天生的天才,你应该学会尊重所有比尤凯名声更高和更低的人,我不能在我的请求类中实现equals()和hashCode(),它是第三方类。我必须在EmpRequest类中完成。Request类不是我自己的类,我不能修改它。由第三方提供。谢谢凯,谢谢你的回答。我明白了。在这种情况下,如何编写hashCode()?我是否需要根据请求类的属性生成哈希代码?谢谢kai,在生成hashCode()时,如果getRequest()本身为null会怎么样?如何处理空场景?谢谢哦,我忘了这个场景。您可以添加一个if条件,如果getRequest()为null,则返回1。Ruchira,我需要根据EmpRequest中的请求对象属性编写它。
equals()
hashCode()
是与对象本身相关的属性。您必须在该对象内实现这些。在其他任何地方都没有。@user755806当我们进行编码时,最好实现
equals()
hashCode()
。这实际上取决于IDE警告级别。Ruchira,我需要根据请求类的属性生成哈希代码吗?谢谢@USER55806如果你想考虑请求类,是的。
public class Request implements Serializable{

     private String id;
     private String name;
     private String hid;

        public String getId()
        {
            return id;
        }

        public String getName()
        {
            return name;
        }

        public String getHid()
        {
            return hid;
        }
}

    public class EmpRequest implements Serializable{
         private Request request;

        public Request getRequest()
        {
            return request;
        }

         @Override 
         public boolean equals(Object obj) {
             if(obj==null)
                 return false;
             if(((EmpRequest) obj).getRequest().getId().equals(this.getRequest().getId()))
                 return true;
             else if(((EmpRequest) obj).getRequest().getName().equals(this.getRequest().getName())
                     &&((EmpRequest) obj).getRequest().getHid().equals(this.getRequest().getHid())) {
                 return true;
             }
             else
                 return false;
         }
    }
@Override
public int hashCode()
{
    final int prime = 31;
    int result = 1;
    result = prime * result + ((getRequest().getId() == null) ? 0 : getRequest().getId().hashCode());
    result = prime * result + ((getRequest().getName() == null) ? 0 : getRequest().getName().hashCode());
    result = prime * result + ((getRequest().getHid() == null) ? 0 : getRequest().getHid().hashCode());
    return result;
}