为什么 override equals() 方法的 return 语句必须使用交替的 && 和 ||?

why the return statement of override equals() method has to use alternate && and ||?

我在网上看到了下面的代码。 class 覆盖对象 class 的 hashCode() 和 equals 方法。我只是想知道为什么 equals() 方法的 return 语句必须使用交替的 && 和 ||?我可以一直使用 && 吗?为什么它必须使用备用 && 和 || 有什么特别的原因吗?

class Person {

private int id;
private String firstName;
private String lastName;

@Override
public boolean equals(Object obj) {
    if (obj == this) {
        return true;
    }
    if (obj == null || obj.getClass() != this.getClass()) {
        return false;
    }

    Person guest = (Person) obj;
    return id == guest.id
            && ((firstName == null ? guest.firstName == null : firstName.equals(guest.firstName))
            || (firstName != null && firstName.equals(guest.getFirstName())))
            && ((lastName == null ? guest.lastName == null : lastName.equals(guest.lastName))
            || (lastName != null && lastName.equals(guest.getLastName())));
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result
            + ((firstName == null) ? 0 : firstName.hashCode());
    result = prime * result + id;
    result = prime * result
            + ((lastName == null) ? 0 : lastName.hashCode());
    return result;
}



}

OR 条件的使用取决于名字或姓氏的值,如果它们不 null 则分别考虑在内。但是那个条件已经在三元组的第二部分检查过了? : 运算符,因此您可以删除 OR 部分。结果是一样的

((firstName == null ? guest.firstName == null : firstName.equals(guest.firstName)) || (firstName != null && firstName.equals(guest.getFirstName())))

两个析取都可以用 || 的第一个操作数替换,因为第二个运算符再次覆盖了三元运算符的第二个选择(假设 getter returns 字段值)

 id == guest.id
        && (firstName == null ? guest.firstName == null : firstName.equals(guest.firstName))
        && (lastName == null ? guest.lastName == null : lastName.equals(guest.lastName));

但我建议重写为

id == guest.id
        && Objects.equals(firstName, guest.firstName)
        && Objects.equals(lastName, guest.lastName);