gpt4 book ai didi

java - 为什么 NetBeans 自动生成等于如此冗长?

转载 作者:行者123 更新时间:2023-11-29 03:04:10 25 4
gpt4 key购买 nike

当 NetBeans 自动生成一个 equals 方法时,它采用以下形式:

@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final MyClass other = (MyClass)obj;
if (!Object.equals(this.field, other.field))
return false;
return true;
}

这看起来很冗长。 Java 的 instanceofnull 值返回 false 那么为什么不将初始测试简化为:

if (!(obj instanceof MyClass))
return false;

我也不清楚为什么这段代码会在字段比较中显式使用 this.field(大概是为了避免混淆)但随后不会使用 this.getClass() 出于同样的原因?

NetBean 的形式有什么优势吗?

最佳答案

instanceof 之间存在 差异和类(Class)比较。请记住(例如)HashMap实例是 instanceof AbstractMap ,但是 AbstractMapequals不应该考虑 other一个AbstractMap如果它实际上是 HashMap . instanceof测试允许类型或其任何子类型的实例,因此不是对称的。 equals需要对称。 (示例如下。)

Netbeans 代码确实看起来很生硬,可以写得更简洁,但是按照给定的顺序,这些操作作为默认起点是有意义的。 (虽然我已经包含了一个 this 检查。)这是一对罕见的可以有用地拥有 equal 的类。实例,所以使用 getClass默认实现是合理的。

只是为了提醒我们所有人 the contract :

  • 它是自反的:对于任何非null引用值(value)x , x.equals(x)应该返回 true .
  • 它是对称的:对于任何非null引用值xy , x.equals(y)应该返回 true当且仅当 y.equals(x)返回 true .
  • 它是可传递的:对于任何非null引用值x , y , 和 z , 如果 x.equals(y)返回 truey.equals(z)返回 true , 然后 x.equals(z)应该返回 true .
  • 它是一致的:对于任何非null引用值x and y , multiple invocations of x.等于(y) consistently returnor consistently return, provided no information used in对象上的 equals` 比较已修改。
  • 对于任何非 null引用值(value)x , x.equals(null)应该返回 false .

在 90 年代早期的 Java 时代,我(无意中)违反了这份契约(Contract),并且 based on the answers to this question ,我不是唯一一个。我用了instanceof (和 super.equals ),像这样:

class Parent {
private int foo;
protected int getFoo() {
return foo;
}

Parent(int f) {
this.foo = f;
}

// ...

@Override
public boolean equals(Object obj) {
// WRONG, see below
if (obj == this) {
return true;
}
if (!(obj instanceof Parent)) {
return false;
}
return this.foo == ((Parent)obj).foo;
}
}

class Child extends Parent {
private int bar;

Child(int f, int b) {
super(f);
this.bar = b;
}

// ...

@Override
public boolean equals(Object obj) {
// WRONG, see below
if (obj == this) {
return true;
}
if (!(obj instanceof Child)) {
return false;
}
return super.equals(obj) && this.bar == ((Child)obj).bar;
}
}

问题是它不对称:

Parent p = new Parent(1);
Child c = new Child(1, 2);
System.out.println(p.equals(c)); // true
System.out.println(c.equals(p)); // false

这违反了契约(Contract)。

关于java - 为什么 NetBeans 自动生成等于如此冗长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33031751/

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