Java 扩展对象的Equals要检查super.Equals(),如果我不想检查,这应该是组合而不是继承吗
因此,情况如下:Java 扩展对象的Equals要检查super.Equals(),如果我不想检查,这应该是组合而不是继承吗,java,inheritance,Java,Inheritance,因此,情况如下: class Feline { String name; int age; equals(Object obj) {...} hashCode(){...} } class Cat extends Feline { int teeth; hashCode(){...} equals(Object obj) { if (!super.equals(obj)) {
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
}
...
}
}
问题是,实际上这种继承是正确的,但对于程序来说,它不一定是正确的。我的想法是猫实际上应该由猫组成。问题是,我应该采取哪种方法
编辑这是Eclipse的实现,默认为equals/hashcode。可能实现equals并不是最准确的方法。我通常不建议继承,除非每个孩子都是父母。你必须问问自己,Cat的每一个实例都是真正的猫吗?我不使用eclipse,所以我从未见过这种实现。我想这在很多情况下都是有道理的 把它去掉,然后从头开始写你自己的就没问题了。在这种情况下,我仍然可以放心地使用继承
我不会太担心你们试图遵循的这些准则,现在就做有意义的事情。您无法预测未来需求的所有变化。请列出测试用例列表,并验证您的设计是否符合您今天所知道的测试用例。Ohoh在继承方面的平等性检查。这很难正确描述,也很难描述 正确的解决方案并不像人们想象的那样直截了当,所以请走吧——这应该会澄清你所有的问题。如果您不想再问一次:) 编辑:作为上述链接的简短总结:相等方法应满足以下属性:
- 它是自反的:对于任何非空值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,前提是没有修改对象上equals比较中使用的信息李>
- 对于任何非null值x,x.equals(null)应返回false
publicbooleanCanequal(objectother)
。如果另一个对象是(重新)定义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;
}
}
如果您从一个类继承,那么如果猫科动物已经通过了该检查,那么您的Cat类就不能相等。那是什么
if (!super.equals(obj))
{
return false; //If I don't want this should I use
}
是的。它并没有说明如果猫科动物返回真的会发生什么。如果它的实现正确,它将检查类的相等性,然后您只需要检查齿
默认实现只是提供了一个确定“不平等”的快捷方式。以你的例子来说,猫总是猫,所以如果猫说我这里的不是猫(即狗),那么你可以放心,它不可能是猫。但是如果它说是猫,那么就由你来决定这只猫是(家里的)猫还是老虎。在现实世界中是的,问题更多地围绕着Eclipse提供的equals实现。这不是你想要的答案,但它肯定是相关的:在你的情况下,没有办法添加方面(“牙齿”,尽管如此[?]猫科动物有牙齿……但关键在于;)并保持平等的(…)契约。从《有效Java自身》一书中,以下引用以粗体显示:“在保留equals契约的同时,根本无法扩展一个可实例化类并添加一个方面”。诉诸权威:去和约书亚·布洛赫争论吧,不是我,我只是引用《有效的Java》一书。)在《有效Java》中,哪一章是我面前的那本书。在我的版本(第一版)中,我在“第3章:所有对象通用的方法”中的“第7项:在重写equals时遵守通用契约”中引用了这句话。希望有帮助:)这个观点是如何建立的?它肯定有一个数学答案,这很有帮助。似乎解决方案是组合。如果您从该链接添加一些信息,我将非常乐意将其标记为正确答案。@Voo:+1,一个经典链接:)我在关于有效Java的评论中提到它时犹豫不决。这解决了问题,因为您摆脱了继承,但您可以“正确”解决此问题而仍然使用继承。正如文章所示,它相当复杂,但可行。在你的例子中什么是最好的取决于你打算用它做什么——继承经常被过度使用,但确实有它的用途。从逻辑的角度来看,猫应该是猫。是的,我想我应该补充一些简短的总结——这是一个如此复杂的话题,我总是喜欢与一些真正的专家联系,但如果我有什么错误,肯定会有人纠正我;)