对于我的"平等"方法,我有以下Findbugs错误,
此类定义一个equals方法,该方法覆盖超类中的equals方法.两个equals方法方法在确定两个对象是否相等时使用instanceof.这充满了危险,因为重要的是equals方法是对称的(换句话说,a.equals(b)== b.equals(a)).如果B是A的一个子类型,并且所述参数是一个instanceof A,以及B的equals方法检查该参数是一个instanceof B A的等于方法检查,这是很可能的是通过这些方法定义的等价关系是不对称的.
我无法在此处发布代码以进行安全违规.请告诉我这是什么错误?
SJu*_*n76 12
它说合同equals()暗示,a.equals(b)当且仅当b.equals(a)是真的时,这是真的.
如果B延伸A,A.equals(Object obj)你可能会有
if !(obj instanceof A) return false;
Run Code Online (Sandbox Code Playgroud)
在B.equals(Object obj)您将有
if !(obj instanceof B) return false;
Run Code Online (Sandbox Code Playgroud)
这是不对称:B的make(b instanceof A)实例为true,而A的实例为(a instanceof B)false.所以它意味着风险而不是a.equals(b)真实而且b.equals(a)是错误的.
您可以使用类似的构造来防止此错误:
public boolean equals(final Object obj)
{
if (obj == null || getClass() != obj.getClass())
{
return false;
}
// ...
Run Code Online (Sandbox Code Playgroud)
代替
public boolean equals(final Object obj)
{
if (!(o instanceof UniversalIDDefinition))
{
return false;
}
// ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5550 次 |
| 最近记录: |