对于我的“平等”方法,我有以下Findbugs错误,
此类定义equals方法 覆盖a中的equals方法 超类。两者都等于方法 方法在中使用instanceof 确定是否有两个物体 是平等的。这充满了危险, 因为平等是重要的 方法是对称的(换句话说, a.equals(b)== b.equals(a))。如果B是 A的子类型和A的等于方法 检查参数是否为 instanceof A和B的equals方法 检查参数是否为 实例B,很有可能 由...定义的等价关系 这些方法不对称。
我无法在此处发布代码以进行安全违规。请告诉我这是什么错误?
答案 0 :(得分:10)
它表示equals()
的合同意味着a.equals(b)
当且仅当b.equals(a)
为真时才为真。
如果B延伸A,则A.equals(Object obj)
中你可能会有
if !(obj instanceof A) return false;
并在B.equals(Object obj)
中有
if !(obj instanceof B) return false;
这是不对称性:B的实例使(b instanceof A
)为真,而A的实例使(a instanceof B
)为假。因此,这意味着风险比a.equals(b)
为真,b.equals(a)
为假。
答案 1 :(得分:2)
您可以使用类似的结构来防止此错误:
public boolean equals(final Object obj)
{
if (obj == null || getClass() != obj.getClass())
{
return false;
}
// ...
而不是
public boolean equals(final Object obj)
{
if (!(o instanceof UniversalIDDefinition))
{
return false;
}
// ...
答案 2 :(得分:0)
您也可以使用它:
if (obj == null || !MyClass.class.isAssignableFrom(obj.getClass())) {
return false;
}