【发布时间】:2023-03-28 02:41:02
【问题描述】:
我刚刚在equals 方法中遇到了一个使用EqualsBuilder() 的代码。使用它而不是编写(或从 eclipse 生成)我们自己的逻辑有什么好处吗?一个简单的例子会更有帮助。
编辑:如果它没有比在类中减少代码有任何好处,那么是否存在反射开销?
【问题讨论】:
标签: java
我刚刚在equals 方法中遇到了一个使用EqualsBuilder() 的代码。使用它而不是编写(或从 eclipse 生成)我们自己的逻辑有什么好处吗?一个简单的例子会更有帮助。
编辑:如果它没有比在类中减少代码有任何好处,那么是否存在反射开销?
【问题讨论】:
标签: java
使用EqualsBuilder 并不比从头开始编写equals 方法更好或更差。换句话说,我不认为使用EqualsBuilder 是最佳做法。
非EqualsBuilder equals() 方法通常如下所示:
public boolean equals(Object other) {
boolean result;
if(this == other)
result = true;
else
if(other == null)
result = false;
else
if(other instanceof MyClass) {
MyClass o=(MyClass) other;
result = Objects.equals(this.a, o.a)
&& Objects.equals(this.b, o.b)
// ...
&& Objects.equals(this.z, o.z);
}
else
result = false;
return result;
}
【讨论】:
ErrorBuilder 没有那么有用或重要,但其他人肯定可以!
例如,我认为不需要。 Equals builder 将为您生成完全相同的代码,因此唯一的区别是您在类中的代码更少。
从我的角度来看,最好编写这些方法(因为当你覆盖 equals 时,你总是必须覆盖 hashCode)
【讨论】:
使用 ANYTHING 除了您自己在 equals() 中的实现之外,如果您可以使用...说严格唯一的 ID,则保证“更糟”。
如果您的 ID 真的是独一无二的,那么您很可能会拥有最好的、可能的实现,当然它需要进行相当多的改进:
@Override
public boolean equals(Object other)
{
if(other instanceof MyClass)
{
MyClass obj = (MyClass)other;
return obj.getID() == this.getID();
}
else
return false;
}
【讨论】:
有几种方法可以解决这个问题。
您可以自己滚动 - 最有可能获得 一些微妙的错误。
您可以让 Eclipse 为您生成 equals 和 hashCode 方法 - 这会留下大量代码,可能会被无意编辑,并且可能会在类获取新字段时无法更新。
您可以使用 EqualsBuilder;它避免了上述问题。
最重要的是,至少根据我的经验,您可以使用 lombok 的 EqualsAndHashCode 注释。
【讨论】: