【问题标题】:How to scalably consider nulls in equals()?如何在equals()中可扩展地考虑空值?
【发布时间】:2019-02-24 06:55:17
【问题描述】:

为了避免我的equals() 中出现空指针异常,我必须考虑一个或多个空值的可能性。

是否有一种可扩展的方式来考虑空值?如果我添加更多类型参数,以下代码将很快变得丑陋。

  public boolean equals(Pair<T, U> p) {

    boolean firstIsEqual, secondIsEqual;

    if (p.getFirst()==null) {
      firstIsEqual = first == null;
    }
    else {
      firstIsEqual = (first!=null) && (first.equals(p.getFirst()));
    }

    // copy-paste...
    if (p.getSecond()==null) {
      secondIsEqual = second == null;
    }
    else {
      secondIsEqual = (second!=null) && (second.equals(p.getSecond()));
    }

    return (firstIsEqual && secondIsEqual);
  }

【问题讨论】:

  • 这不是标准用途的有效equals;使用@Override 将有助于防止此问题。假设Pair 是你自己的类,那么(在适当的类型检查之后你必须添加)我就写return Objects.equals(this.first, p.first) &amp;&amp; Objects.equals(this.second, p.second);
  • @chrylis 如果我覆盖,我将不得不将Object 转换为Pair(“未经检查的转换”警告)。这不是应该避免的吗?
  • 这不是未经检查的演员表,而是关于泛型的。一般来说是的,你应该避免它,但在equals(Object) 这是不可避免的。如果你不覆盖(并覆盖hashCode),你肯定不会得到你期望的行为。

标签: java generics nullpointerexception null equals


【解决方案1】:

唯一可扩展的解决方案是:

  • 使用像 Lombok 这样的库,它提供了在编译阶段生成此类方法的方法
  • 使用 IDE 的内置代码生成功能

说真的:现实世界中没有人手动编写 equals/hashCode 方法。您使用工具并告诉计算中应使用哪些字段。如果添加了字段,您必须记住重新生成方法。

或者您使用支持 Kotlin 或 Scala 等数据类的 jvm 语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2011-02-07
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多