【问题标题】:EqualsBuilder vs own equals methodEqualsBuilder 与自己的 equals 方法
【发布时间】:2023-03-28 02:41:02
【问题描述】:

我刚刚在equals 方法中遇到了一个使用EqualsBuilder() 的代码。使用它而不是编写(或从 eclipse 生成)我们自己的逻辑有什么好处吗?一个简单的例子会更有帮助。

编辑:如果它没有比在类中减少代码有任何好处,那么是否存在反射开销?

【问题讨论】:

标签: java


【解决方案1】:

使用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;
}

【讨论】:

  • 那么他们为什么要提出 EqualsBuilder.?
  • 我认为您的意思是“固有地”,而不是“隐含地”。
  • 我们是在争论 cmets 中的单词选择吗?定义implicitly:无限定:绝对。如果您认为这很重要,请随时提交修改以供审核。
  • @VallabhPatade 很难说。有人可能认为它更不容易出错、更容易或更易读。我个人认为ErrorBuilder 没有那么有用或重要,但其他人肯定可以!
  • Objects.equals 仅在 Java 7 中引入。EqualsBuilder 早于 Java 7。
【解决方案2】:

例如,我认为不需要。 Equals builder 将为您生成完全相同的代码,因此唯一的区别是您在类中的代码更少。

从我的角度来看,最好编写这些方法(因为当你覆盖 equals 时,你总是必须覆盖 hashCode)

【讨论】:

    【解决方案3】:

    使用 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;
    }
    

    看看thisthis尤其是this

    【讨论】:

      【解决方案4】:

      有几种方法可以解决这个问题。

      1. 您可以自己滚动 - 最有可能获得 一些微妙的错误。

      2. 您可以让 Eclipse 为您生成 equals 和 hashCode 方法 - 这会留下大量代码,可能会被无意编辑,并且可能会在类获取新字段时无法更新。

      3. 您可以使用 EqualsBuilder;它避免了上述问题。

      4. 最重要的是,至少根据我的经验,您可以使用 lombok 的 EqualsAndHashCode 注释。

      【讨论】:

      • 比较 equals() 的字段非常容易出错,因为瞬态字段很可能携带易失但重要的信息 - 在 equals() 中忽略这些将导致数据丢失,因为两个对象已被修改几乎并行将被归类为相等,有效地删除结果并否定已经投入的计算能力 - 在最坏的情况下,如果它依赖于对象排列的顺序、完整结果解析,甚至可能会使整个应用程序崩溃。跨度>
      • @specializt:对于正常做法,我支持答案中的建议。当然有非常罕见的特殊情况需要其他方法,但您的评论具有误导性和挑衅性。
      • 这些“非常罕见的特殊情况”实际上是日常情况,也是唯一可以无损存储数据的方法。数据库以这种方式工作(PRIMARYKEY),文件系统以这种方式工作(文件名和时间戳)等等......它是一个基本的 IT 概念。对不起,显然你们错过了很多东西。身份始终必须以一个单一的信息点为中心,无论这些信息有多么广泛。如果键盘上的键没有“绝对”(如果可能的话)身份,您将无法键入这些单词。
      猜你喜欢
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多