在重写的equals方法期间存储中间结果

时间:2016-02-23 20:57:31

标签: java oop override method-overriding side-effects

实际案例:
我想覆盖当前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 );
        }
    }
}

1 个答案:

答案 0 :(得分:1)

如果您需要对特定方法(或几乎任何方法)进行一些额外处理而不涉及程序代码,请考虑面向方面编程。当您在编译期间或动态修改字节码时,这是一种技术。这听起来很复杂,但事实并非如此。此技术非常适合日志记录,监视,额外安全性,异常处理等。就个人而言,我更喜欢将它用于与领域模型无关的事情。想象一下,如果你需要为整个程序进行日志记录。您需要为要记录的每个方法添加额外的行。使用AOP,您可以使用非常少的行来完成此操作,而无需触及您的程序代码。阅读 AspectJ 。它是迄今为止最古老且可能是最先进的工具(BCEL除外 - 直接字节代码操作框架)