gpt4 book ai didi

java - 为什么 Eclipse 生成的 equals() 实现在类型检查(instanceof)之前检查是否为 null?

转载 作者:搜寻专家 更新时间:2023-10-30 19:46:32 25 4
gpt4 key购买 nike

我经常使用 Eclipse 的代码生成工具(Source/Generate hashCode() 和 equals()...)为简单的 POJO 类创建 equals() 实现。如果我选择“Use instanceof to compare types”,这会产生一个类似这样的 equals() 实现:

  @Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof MyClass)) {
return false;
}
MyClass other = (MyClass) obj;
// check the relevant fields for equality
}

今天一位同事指出,第二个 if 语句根本没有必要,因为只要 obj 为 null,instanceof 类型检查就会返回 false。 ( See question 3328138. )

现在,我猜那些为 Eclipse JDT 编写代码模板的人也值得一试。所以我想肯定有一些空检查的原因,但我不确定它是什么?

(另外 question 7570764 可能会给出提示:如果我们使用 getClass() 比较而不是 instanceof 进行类型检查,obj.getClass() 不是空安全的。也许代码模板不够聪明,无法省略空检查如果我们使用 instanceof。)

编辑:Dragan 在他的回答中注意到,instanceof 类型检查不是 Eclipse 中的默认设置,因此我将其编辑为排除了问题。但这并没有改变任何东西。

另外请不要建议我使用 getClass() 或(甚至更好!)不同的 IDE。那不是重点,那不回答问题。我没有就如何编写 equals() 实现、是否使用 instanceof 或 getClass() 等征求意见。

问题大致是:这是 Eclipse 中的一个小错误吗?如果不是,那为什么它有资格成为一项功能?

最佳答案

这是不必要的,因为 instanceof 有一个内置的空检查。但是 instanceof 远不止简单的 foo == null。这是一个完整的说明,准备类检查,在空检查完成之前做一些不必要的工作。 (更多详情请参阅 http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.instanceof)

因此,单独的 null 检查可能会提高性能。进行了快速测量,毫不奇怪 foo==null 比使用 instanceof 进行 nullcheck 更快。

但通常您在 equals() 中不会有大量空值,大多数情况下您会进行重复的不必要的空值检查……这可能会耗尽在空值比较期间所做的任何改进。

我的结论:没必要。

用于测试完整性的代码(记得使用 -Djava.compiler=NONE 否则你只会衡量 java 的能力):

public class InstanceOfTest {
public static void main(String[] args) {
Object nullObject = null;

long start = System.nanoTime();
for(int i = Integer.MAX_VALUE; i > 0; i--) {
if (nullObject instanceof InstanceOfTest) {}
}
long timeused = System.nanoTime() - start;

long start2 = System.nanoTime();
for(int i = Integer.MAX_VALUE; i > 0; i--) {
if (nullObject == null) {}
}
long timeused2 = System.nanoTime() - start2;

System.out.println("instanceof");
System.out.println(timeused);
System.out.println("nullcheck");
System.out.println(timeused2);
}
}

关于java - 为什么 Eclipse 生成的 equals() 实现在类型检查(instanceof)之前检查是否为 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32048018/

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