【问题标题】:equals method overrides equals in superclass and may not be symmetricequals 方法覆盖超类中的 equals 并且可能不是对称的
【发布时间】:2011-09-25 00:02:11
【问题描述】:

我的“相等”方法出现以下 Findbugs 错误,

这个类定义了一个equals方法 覆盖 a 中的 equals 方法 超类。两个等于方法 方法在 判断两个物体是否 是平等的。这充满了危险, 因为重要的是等于 方法是对称的(换句话说, a.equals(b) == b.equals(a))。如果 B 是一个 A 的子类型,以及 A 的 equals 方法 检查参数是否为 instanceof A 和 B 的 equals 方法 检查参数是否为 instanceof B,很可能是 由下式定义的等价关系 这些方法不是对称的。

由于安全违规,我无法在此处发布代码。请告诉我是什么错误?

【问题讨论】:

  • 如果不贴一些有代表性的代码,就很难看出错误了……
  • 他只需要对 findbugs“错误”的解释。在我看来,不需要代码。

标签: java


【解决方案1】:

它说equals() 的契约意味着,当且仅当b.equals(a) 为真时,a.equals(b) 为真。

如果 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) 为假。

【讨论】:

  • EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC
【解决方案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;
   }   
// ...

【讨论】:

    【解决方案3】:

    你也可以用这个:

    if (obj == null || !MyClass.class.isAssignableFrom(obj.getClass())) {
        return false;
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 2013-08-20
    • 1970-01-01
    • 2011-04-17
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多