基类和子类中的Java equals方法
我有一个简单的基类,后来被许多单独的类扩展,这些类可能引入新的字段,但不一定。我在基类中定义了一个equals方法,但也为一些子类重写了它。在基类/子类中混合定义可以吗?在我的例子中,这是为了避免代码重复检查相同的字段
你可以在下面搜索框中键入要查询的问题!
我有一个简单的基类,后来被许多单独的类扩展,这些类可能引入新的字段,但不一定。我在基类中定义了一个equals方法,但也为一些子类重写了它。在基类/子类中混合定义可以吗?在我的例子中,这是为了避免代码重复检查相同的字段
# 1 楼答案
我想,在}中提供
super
{equals(Object obj)
和hashCode()
方法实现就像Java
所做的那样是完美的。我们都知道Java在基类java.lang.Object中提供了hashCode() and equals(Object obj)
方法实现,当需要时,我们在我们的class
中提供了override
方法实现# 2 楼答案
这是一个相当有效的方法。该问题存在于您的一个子类中,它必须保留由其父类约束的相等定义。否则,您将有一个中断的equals函数,这可能会导致在运行时出现一些非常独特的情况
# 3 楼答案
虽然下面的内容并不适用于所有情况,但我发现它非常实用。当我同时拥有一个超类和一个子类时,我已经使用过很多次了。我不想相互比较它们,但我也不想为子类重新实现所有的超类equals()。它处理:
代码示例
# 4 楼答案
看看安吉丽卡·兰格的"Implementing equals() To Allow Mixed-Type Comparison"
以下是一些问题的简要说明和可能的解决方案:
平等合同(除其他外)规定:
这意味着您可能会遇到问题,如果您的子类正在引入新字段,并且您正在将基类的对象(或另一个不重写等于的子类)与该子类的对象进行比较
不要执行以下操作:
因为你得到了
可能的解决方案:
用类比较替换
instanceof
-检查:使用此解决方案,
BaseClass
的对象永远不会等于任何子类的对象如果创建另一个
SubClass
而不使用equals
方法的@Override
,两个SubClass
-对象可以在开箱即用的情况下彼此相等(如果BaseClass.equals
复选框决定是这样),但是SubClass
-对象永远不会等于BaseClass
-对象一个好的实施可以如下所示:
请参阅上面提到的文章,了解更高级的问题及其解决方案
# 5 楼答案
您可以使用
super()
方法来调用您正在扩展的类的方法,以防止任何代码重复的需要# 6 楼答案
不,在引入与equals方法相关的新字段时,不可能遵守equals契约。有关更多信息,请参阅Joshua Bloch的“高效Java”
编辑:
我现在手头没有这本书,但是我认为如果基类是抽象的/不能实例化的,那也没关系