gpt4 book ai didi

java - 什么是用于覆盖 hashcode() 和 equals() 方法的 HashCodeBuilder 和 EqualsBuilder?

转载 作者:行者123 更新时间:2023-12-01 14:07:27 29 4
gpt4 key购买 nike

我必须重写实体类的 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;
}

为什么?

Second 默认由 STS IDE 创建。请告诉我第一个选项到底是什么以及为什么更喜欢?

最佳答案

就我个人而言,我不会使用反射来计算等于和哈希码。

如文档所述(对于 EqualsBuilder.reflectionEquals):

It uses AccessibleObject.setAccessible to gain access to private fields. This means that it will throw a security exception if run under a security manager, if the permissions are not set up correctly. It is also not as efficient as testing explicitly. Non-primitive fields are compared using equals().

所以

  • 您正在执行危险操作(您甚至不确定自己不会得到 SecurityException)
  • 效率较低,因为您使用反射来计算这些值

作为个人观点,我真的觉得使用反射来计算你类(class)的等号和哈希码是无稽之谈。这就像使用了错误的工具。

由于您已经在使用第三方库,我会像这样使用 HashCodeBuilder :

@Override
public int hashCode() {
return new HashCodeBuilder().append(userKey)
.append(id)
.append(userEntity)
.toHashCode();
}

与等号相同:

@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生成的更具可读性,并且不使用反射。

关于java - 什么是用于覆盖 hashcode() 和 equals() 方法的 HashCodeBuilder 和 EqualsBuilder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28061360/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com