为什么 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);
我在网上看到了下面的代码。 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);