为包含布尔字段的持久实体覆盖 hashCode() 的正确方法?
Correct way to override hashCode() for persistent entity containing a boolean field?
private long configKeyMasterId;
private String configKey;
private boolean isDisplay;
public int hashCode() {
int result = (int) (configKeyMasterId ^ (configKeyMasterId >>> 32));
result = 31 * result + (configKey != null ? configKey.hashCode() : 0);
result = 31 * result + (isDisplay != null ? isDisplay.hashCode() : 0);
return result;
}
这就是我所拥有的,其中 isDisplay
是一个布尔字段。我知道第 3 行是错误的,但我该如何解决?
像
一样天真
result = 31 * result + (isDisplay != false ? Boolean.hashCode(isDisplay) : 0);
还好吗?
我不知道 hashCode()
究竟如何或为何必须被覆盖,但我正在阅读它。
检查 false
是多余的。就这样
result = 31 * result + Boolean.hashCode(isDisplay);
EDIT 请注意,这假定 isDisplay
是原始字段。如果是方框字段 (Boolean
),则您发布的版本(带有空检查)应该是正确的。
如果您使用的是 Java 7 或更高版本,您可以使用 Objects.hash(...)
而不是自己编写并避免空检查。
return Objects.hash(configKey, isDisplay);
private long configKeyMasterId;
private String configKey;
private boolean isDisplay;
public int hashCode() {
int result = (int) (configKeyMasterId ^ (configKeyMasterId >>> 32));
result = 31 * result + (configKey != null ? configKey.hashCode() : 0);
result = 31 * result + (isDisplay != null ? isDisplay.hashCode() : 0);
return result;
}
这就是我所拥有的,其中 isDisplay
是一个布尔字段。我知道第 3 行是错误的,但我该如何解决?
像
一样天真result = 31 * result + (isDisplay != false ? Boolean.hashCode(isDisplay) : 0);
还好吗?
我不知道 hashCode()
究竟如何或为何必须被覆盖,但我正在阅读它。
检查 false
是多余的。就这样
result = 31 * result + Boolean.hashCode(isDisplay);
EDIT 请注意,这假定 isDisplay
是原始字段。如果是方框字段 (Boolean
),则您发布的版本(带有空检查)应该是正确的。
如果您使用的是 Java 7 或更高版本,您可以使用 Objects.hash(...)
而不是自己编写并避免空检查。
return Objects.hash(configKey, isDisplay);