我有一个有4个属性的bean:
user
institutionId
groupId
postingDate
我使用Eclipse生成equals和hashcode,但结果代码并不漂亮。是否有一种紧凑的方式来做同样的事情?假设我想要等于& hashcode使用所有属性或其子集。
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((groupId == null) ? 0 : groupId.hashCode());
result = prime * result + ((institutionId == null) ? 0 : institutionId.hashCode());
result = prime * result + ((postingDate == null) ? 0 : postingDate.hashCode());
result = prime * result + ((user == null) ? 0 : user.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ManGroupKey other = (ManGroupKey) obj;
if (groupId == null) {
if (other.groupId != null)
return false;
} else if (!groupId.equals(other.groupId))
return false;
if (institutionId == null) {
if (other.institutionId != null)
return false;
} else if (!institutionId.equals(other.institutionId))
return false;
if (postingDate == null) {
if (other.postingDate != null)
return false;
} else if (!postingDate.equals(other.postingDate))
return false;
if (user == null) {
if (other.user != null)
return false;
} else if (!user.equals(other.user))
return false;
return true;
}
答案 0 :(得分:6)
在Java 7中
public int hashCode() {
return Objects.hash(groupId, institutionId, postingDate, user);
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
// cast to correct class
Target o = (Target)obj;
return Objects.equals(groupId, o.groupId) &&
Objects.equals(institutionId, o.institutionId) &&
Objects.equals(postingDate, o.postingDate) &&
Objects.equals(user, o.user);
}
答案 1 :(得分:5)
你可以压缩代码,但是你引入错误的几率远高于你做任何有用的东西。等于和哈希码方法的所有部分都是有原因的。
如果困扰你,大多数IDE都有折叠编辑器,只需点击黄色小框(通常),方法的所有内容都会被隐藏起来。
答案 2 :(得分:4)
您可以使用Apache-common-langs(http://commons.apache.org/proper/commons-lang/)类HashCodeBuilder和EqualsBuilder来代替使用eclipse生成的代码:
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this);
}
答案 3 :(得分:2)
的hashCode: 之一:
@Override
public int hashCode() {
return Objects.hash(user, institutionId, groupId, postingDate);
}
或者:
@Override
public int hashCode() {
int result = 17;
result = 31 * result + Objects.hashCode(user);
result = 31 * result + Objects.hashCode(institutionId);
result = 31 * result + Objects.hashCode(groupId);
result = 31 * result + Objects.hashCode(postingDate);
return result;
}
等于:
public boolean equals(Object obj){
if (obj == this){
return true;
}
if (! (obj instanceof ManGroupKey)){
return false;
}
ManGroupKey other = (ManGroupKey) obj;
return Objects.equals(user, other.user)
&& Objects.equals(institutionId, other.institutionId)
&& Objects.equals(groupId, other.groupId)
&& Objects.equals(postingDate, other.postingDate);
}
答案 4 :(得分:1)
您可以通过删除other.x != null
支票来删除一级嵌套。
以这种方式比较值:当x.equals(y)
为false
时,y
将始终返回null
。
除此之外:.equals()
方法是一个很好的例子,其中一些反射可以很方便,可能被提取到一个通用的实用方法中。您所要做的就是浏览不同的字段,看看它们在两个对象中是否相等,可以在几行中完成。
显然,这只有在您真正想要比较每个字段时才可行(或者您必须添加一些添加内容以便您选择字段)。
答案 5 :(得分:1)
我认为可以为你提供套件的库是常见的apache。它提供EqualsBuilder
和HashCodeBuilder
类,完全符合您的要求。
请考虑此问题以获取详细信息:Apache Commons equals/hashCode builder
以下是一些代码段:
public class Bean{
private String name;
private int length;
private List<Bean> children;
@Override
public int hashCode(){
return new HashCodeBuilder()
.append(name)
.append(length)
.append(children)
.toHashCode();
}
@Override
public boolean equals(final Object obj){
if(obj instanceof Bean){
final Bean other = (Bean) obj;
return new EqualsBuilder()
.append(name, other.name)
.append(length, other.length)
.append(children, other.children)
.isEquals();
} else{
return false;
}
}
}