我必须覆盖实体类的equals()方法和hascode()方法。 但我的问题是为什么要使用HashcodeBuilder和EqualsBuilder来实现它。
这两者中哪一个更好,为什么?
@Override
public int hashCode()
{
return HashCodeBuilder.reflectionHashCode(this, false);
}
@Override
public boolean equals(Object obj)
{
return EqualsBuilder.reflectionEquals(this, obj);
}
OR
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((userKey == null) ? 0 : userKey.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((userEntity == null) ? 0 : userEntity.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;
UserKeyEntity other = (UserKeyEntity) obj;
if (UserKey == null)
{
if (other.userKey != null)
return false;
}
else if (!userKey.equals(other.userKey))
return false;
if (id == null)
{
if (other.id != null)
return false;
}
else if (!id.equals(other.id))
return false;
if (userEntity == null)
{
if (other.userEntity != null)
return false;
}
else if (!userEntity.equals(other.userEntity))
return false;
return true;
}
为什么?
默认情况下,第二个是由STS IDE创建的。 请告诉我第一个选项到底是什么以及为什么要选择?
答案 0 :(得分:8)
就个人而言,我不会使用反射来计算equals和hashcode。
正如文档所述(EqualsBuilder.reflectionEquals
):
它使用AccessibleObject.setAccessible来访问私有 领域。这意味着如果运行它将抛出安全异常 在安全管理器下,如果未正确设置权限。 它也没有明确测试那么高效。非原始 使用equals()比较字段。
所以
SecurityException
)从个人的角度来看,我真的觉得使用反射来计算你的类中的equals和hashcode是没有意义的。这就像使用错误的工具。
由于您已经在使用第三方库,我会像这样使用HashCodeBuilder
:
@Override
public int hashCode() {
return new HashCodeBuilder().append(userKey)
.append(id)
.append(userEntity)
.toHashCode();
}
与equals相同:
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
UserKeyEntity other = (UserKeyEntity) obj;
return new EqualsBuilder().append(userKey, other.userKey)
.append(id, other.id)
.append(userEntity, other.userEntity)
.isEquals();
}
比Eclipse生成的更具可读性,并且不使用反射。
答案 1 :(得分:1)
HashcodeBuilder和EqualsBuilder会影响性能,因为它使用反射,它会慢于第二个。
您可以使用IDE通过HashcodeBuilder和EqualsBuilder生成的那个。
HashcodeBuilder和EqualsBuilder将易于阅读,理解并具有动态性。