作者:huangbaihao54 | 来源:互联网 | 2023-05-25 18:36
如何解决《什么是HashCodeBuilder和EqualsBuilder,用于覆盖hashcode()和equals()方法?》经验,为你挑选了1个好方法。
我必须覆盖实体类的equals()方法和hascode()方法.但我的问题是为什么要使用HashcodeBuilder和EqualsBuilder来实现它.
这两者中哪一个更好,为什么?
@Override
public int hashCode()
{
return HashCodeBuilder.reflectionHashCode(this, false);
}
@Override
public boolean equals(Object obj)
{
return EqualsBuilder.reflectionEquals(this, obj);
}
要么
@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创建的.请告诉我第一个选项到底是什么以及为什么要选择?
1> user2336315..:
就个人而言,我不会使用反射来计算equals和hashcode.
正如文件所述(for 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生成的更具可读性,并且不使用反射.