扩展对象的Equals想要检查super.equals(),如果我不想要这个检查,这应该是复合而不是继承



所以情况如下:

class Feline  
{  
   String name;  
   int age;  
   equals(Object obj) {...}  
   hashCode(){...}  
}  

class Cat extends Feline  
{  
   int teeth;  
   hashCode(){...}  
   equals(Object obj)  
   {
     if (!super.equals(obj))
    {
        return false;   //If I don't want this should I use 
    }    
      ...
   }  
}

问题是这个继承实际上是正确的,但对程序来说不一定是正确的。我的想法是Cat应该是由Feline组成的。问题是,我应该采取哪一种方法?

编辑
这是Eclipse的实现,默认等于/hashcode。也许equals的实现并不是最准确的方法

面对继承时的相等性检查。这是非常困难的正确和相当长的描述。

正确的解决方案并不像人们想象的那么简单,所以请阅读这篇文章——这应该会澄清你所有的问题。如果不满意,请再问一遍:)

编辑:所以作为上面链接的简短总结:一个等式方法应该满足以下属性:

  • 它是自反的:对于任何非空值x,表达式x.equals(x)应该返回true。
  • 它是对称的:对于任何非空值x和y,当且仅当y.equals(x)返回true, x.equals(y)应该返回true。
  • 它是可传递的:对于任何非空值x, y和z,如果x.equals(y)返回true并且y.equals(z)返回true,则x.equals(z)应该返回true。
  • 它是一致的:对于任何非空值x和y, x.equals(y)的多次调用应该一致地返回true或一致地返回false,前提是在对象的相等比较中使用的信息没有被修改。
  • 对于任何非空值x, x.equals(null)应该返回false。

为了保证这个工作,我们需要指定另一个方法:public boolean canEqual(Object other)。如果另一个对象是canEqual被(重新)定义的类的实例,这个方法应该返回true,否则返回false。

换句话说,如果我们覆盖equal()本身,该方法必须始终被覆盖。实现本身很简单,一个简短的例子:

class Foo {
    public boolean canEqual(Object other) {
        return other instanceof Foo;
    }
    // equals implementation, etc.
}

equals方法本身必须首先检查给定的对象是否可以等于它自己,例如other.canEqual(this) && restOfComparison

一个扩展上面Foo的类的简短示例:

class Bar extends Foo {
    public boolean equals(Object other) {
        if (other instanceof Bar) {
             Bar that = (Bar)other;
             return that.canEqual(this) && otherStuff;
        }            
        return false;
    }
    public boolean canEqual(Object other) {
          return other instanceof Bar;
    }
}

我不使用eclipse,所以我从未见过这个实现。我想这在很多情况下都是有道理的。

删除它并从头编写自己的代码是没有问题的。在这种情况下,我仍然可以放心地使用继承。

我不会太担心你试图遵循的这些指导方针,只要做现在有意义的事情。您无法预测需求的所有未来变化。制作一个测试用例列表,并验证您的设计是否符合您今天所知道的测试用例。

如果你继承了一个类,如果猫科类没有通过检查,那么你的Cat类就不可能是相等的。

if (!super.equals(obj))
{
    return false;   //If I don't want this should I use 
} 

。它没有说明如果猫科动物返回true会发生什么。如果实现得当,它会检查类的平等,然后你只需要检查牙齿。

默认实现只提供了一个快捷方式来确定'不相等'。在你的例子中,猫总是猫科动物,所以如果猫科动物说我这里的不是猫科动物(即犬类),那么你可以放心,它不可能是一只猫。但是如果它说是,它是一只猫科动物,那么由你来决定这只猫科动物是(家)猫还是虎。

除非每个子节点都是父节点,否则我通常不推荐继承。你得问问自己,猫真的是一只猫吗?

最新更新