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

Java 在重写的equals方法期间存储中间结果,java,oop,overriding,side-effects,Java,Oop,Overriding,Side Effects,实际情况: 我想为我当前java项目中的一些对象重写公共布尔等于(java.lang.Object obj)。当质询对象被视为等于当前质询对象时,此方法仍应返回true。但是,在建立对象之间的相等性时,我需要将一些处理结果存储在属于另一个单例类的数据结构中(如果有差异,我必须存储差异列表,以便将来在应用程序工作流中使用) 调用重写的equals()将产生副作用,这与我确定对象相等的方式密切相关。但是,如果该方法未被重写,则不会产生任何副作用。这是否被视为设计缺陷?是否有任何好的做法会与这种做法背

实际情况:
我想为我当前java项目中的一些对象重写
公共布尔等于(java.lang.Object obj)
。当质询对象被视为等于当前质询对象时,此方法仍应返回
true
。但是,在建立对象之间的相等性时,我需要将一些处理结果存储在属于另一个单例类的数据结构中(如果有差异,我必须存储差异列表,以便将来在应用程序工作流中使用)

调用重写的
equals()
将产生副作用,这与我确定对象相等的方式密切相关。但是,如果该方法未被重写,则不会产生任何副作用。这是否被视为设计缺陷?是否有任何好的做法会与这种做法背道而驰

关于方法重写的Oracle文档非常简洁,imho,关于这一点:“子类重写方法的能力允许类从行为“足够接近”的超类继承,然后根据需要修改行为。”

我看不出这种说法有任何限制,但我想从OOP开发人员/设计师/架构师那里得到建议

谢谢大家!

更多详细信息(简化代码):

//Dataform是一个JAX bean类
公共类数据表单{
字符串名;
//Column是一个JAX bean类
阵列列表列;
//Footer是一个JAX bean类
页脚;
//对于每个JAX bean类,equals的重新定义方式相同
@凌驾
公共布尔等于(对象obj){
if(this.getClass().isInstance(obj)){
//equalsXML是一种比较XML元素(本例中为JAX bean)的方法
if(XMLObject.equalsXML(this,obj.isEmpty()){
//在singleton类中存储差异以备将来访问
返回false;
}
否则{
返回true;
}
}
否则{
返回super.equals(obj);
}
}
}

< /代码> 如果您需要对特定的方法(或几乎任何东西)进行额外的处理,而不需要接触程序代码,请考虑<强>面向方面的编程< /强>。这是一种在编译时或动态修改字节码的技术。这听起来很复杂,但事实并非如此。这种技术非常适合于日志记录、监视、额外安全性、异常处理和其他许多方面。就个人而言,我更喜欢将其用于与域模型无关的事情。想象一下,如果您需要对整个程序进行日志记录。您需要为要记录的每个方法添加额外的行。有了AOP,你只需要很少的几行代码就可以做到这一点,而根本不需要接触你的程序代码。阅读有关AspectJ的内容。它是迄今为止最古老、可能也是最先进的工具(BCEL-直接字节码操作框架除外)

您能否就“需要存储一些处理结果”给出更多描述(即代码)缓存通常不被认为是一种副作用,它只是一种性能提升,通过允许在后续使用中更快地查询缓存结果,无论是从
equals()
还是从其他位置。如果
equals
在调用时始终按应有的方式返回,并且您没有修改正在比较的对象,则没有副作用我只是编辑了文章,我实际上需要存储在比较过程中发现的差异,如果有的话。谢谢Yaroslav。这些JAX bean的
equals()
方法将只使用特定参数调用一次,如应用程序工作流中所设计的那样。之后,平等信息存储在整个应用程序中可用的数据结构中,而无需重新检查对象(基本、质询)。评估两个Dataform对象是否相等的成本很高,我只想存储一次此信息(以及差异,如果有的话)。我还将添加一个保护措施,如果当前对象的数据结构已经更新,将防止重新处理。谢谢Justas,我知道AOP,但这不适合这里的具体情况。我需要将两个对象之间的差异列表(如果有的话)存储在一个特定的数据结构中,可以从项目(应用程序)中的任何地方访问。@a.Karali我想了解更多关于您的代码的信息。您要存储的数据是不可变的吗?如果是,您可以使用工厂为您创建对象并处理该数据。您可以在这些类上实现接口,并对所需的类使用Decorator模式。或者,如果不想过度设计代码,只需在重写的方法中进行处理。只要不违反SOLID,这不是个坏主意。数据是可变的,因为它必须决定如何处理存储的差异(XMLDifference类中的标志):将差异应用于另一个数据表单或忽略它。我决定在覆盖的equals中进行这种差异存储处理,这就是问题背后的要点,这是否会损害一个人的良好实践?到目前为止,根据前面的评论,情况似乎并非如此。
// 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 );
        }
    }
}