实际案例:
我想覆盖当前Java项目中某些对象的public boolean equals(java.lang.Object obj)
。当挑战对象被认为等于当前对象时,此方法仍应返回true
。但是,在建立对象之间的相等性时,我需要将一些处理结果存储在属于另一个,单例,类的数据结构中(我必须存储差异列表,如果有的话,以备将来在应用程序工作流中使用)。
调用被覆盖的equals()
将产生副作用,这与我确定对象相等的方式密切相关。但是,当该方法未被覆盖时,该方法没有副作用。那被认为是一个设计缺陷吗?是否有任何良好的做法会违背这种做法?
关于方法覆盖的Oracle文档非常简洁,imho,关于此:“子类覆盖方法的能力允许类从行为”足够接近“的超类继承,然后根据需要修改行为。 ”
我认为这种说法没有任何限制,但我希望得到OOP开发人员/设计师/建筑师的建议。
谢谢!
更多细节(简化代码):
// Dataform is a JAX bean class
public class Dataform {
String name;
// Column is a JAX bean class
ArrayList<Column> columns;
// Footer is a JAX bean class
Footer footer;
// equals is redefined the same way for each JAX bean classes
@Override
public boolean equals(Object obj){
if(this.getClass().isInstance( obj )){
// equalsXML is a method that compares XML elements (JAX beans in this case). This method can in turn call equals() on
if (XMLObject.equalsXML( this, obj ).isEmpty()){
// Store differences in singleton class for future access
return false;
}
else{
return true;
}
}
else{
return super.equals( obj );
}
}
}
答案 0 :(得分:1)
如果您需要对特定方法(或几乎任何方法)进行一些额外处理而不涉及程序代码,请考虑面向方面编程。当您在编译期间或动态修改字节码时,这是一种技术。这听起来很复杂,但事实并非如此。此技术非常适合日志记录,监视,额外安全性,异常处理等。就个人而言,我更喜欢将它用于与领域模型无关的事情。想象一下,如果你需要为整个程序进行日志记录。您需要为要记录的每个方法添加额外的行。使用AOP,您可以使用非常少的行来完成此操作,而无需触及您的程序代码。阅读 AspectJ 。它是迄今为止最古老且可能是最先进的工具(BCEL除外 - 直接字节代码操作框架)