在java中重写equals和hashcode方法?
我有课下作业 Request.java 在EmpRequest类中,我需要基于请求对象的属性重写在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()和
equals()
和hashCode()
如果两个请求对象id相等,那么我需要返回true。
如果两个对象ID不相等,那么我需要检查name和hid属性。
如果两个对象的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;
}