繁体   English   中英

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

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

我在网上看到下面的代码。 该类重写Object类的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;
}



}

这两个析取符都可以替换为||的第一个操作数。 ,因为第二个运算符仅再次覆盖了tenary运算符的第二个替代项(假设getter返回字段值)

 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);

如果不是null值,则根据分别考虑的名字或姓氏的值使用或条件。 但是那个条件已经在三元组的第二部分中检查了吗? :运算符,因此您可以删除“或”部分。 结果将是相同的

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM