代码之家  ›  专栏  ›  技术社区  ›  Tom Brito

FindBugs有争议的描述

  •  1
  • Tom Brito  · 技术社区  · 6 年前

    是我理解错了,还是描述错了?

    等于检查不相容性 操作数

    类的父类型或子类型 它定义了equals方法)。对于 例如,Foo类可能有 等于如下所示的方法:

    public boolean equals(Object o) {
      if (o instanceof Foo)
        return name.equals(((Foo)o).name);
      else if (o instanceof String)
        return name.equals(o);
      else return false;
    

    实现一个equals方法 对称的和可传递的。没有 行为是可能的。

    发件人: http://findbugs.sourceforge.net/bugDescriptions.html#EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS

    下面的方法应该如何正确?

    @Override
    public boolean equals(Object obj) {
    if (obj instanceof DefaultTableModel)
        return model.equals((DefaultTableModel)obj);
    else
        return false;
    }
    
    3 回复  |  直到 14 年前
        1
  •  4
  •   Jonathan Feinberg    15 年前

    您不应该说您的对象等于某个DefaultTableModel,因为无法强制实现该关系的自反性。这意味着

    DefaultTableModel dtm = new DefaultTableModel(...);
    YourObject foo = new YourObject(dtm);
    foo.equals(dtm); // true
    dtm.equals(foo); // false!
    
        2
  •  3
  •   Stephen C    14 年前

    该方法的第一个版本(FindBugs抱怨)的问题是 .

    f f.equals("someName") true "someName".equals(f) 也应该是 . 但你不可能做到这一点: "someName".equals(...) 会回来的 false

    这个方法的第二个版本也是错误的,因为你说 Foo 实例可以等于 DefaultTableModel 实例。。。但不是另一个 实例。这意味着 equals 因此 . 此外,目前还不清楚 model

        3
  •  0
  •   Bananeweizen    14 年前

    实现中不寻常的部分是比较 字段“model” 与完整的 对象“obj”