gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:34:33 26 4
gpt4 key购买 nike

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

调用重写的equals()将会产生副作用,该副作用与我确定对象相等的方式密切相关。但是,如果不重写该方法,则不会产生副作用。这是否被视为设计缺陷?有什么好的做法可以反对这种方法吗?

关于方法重写的 Oracle 文档非常简洁,恕我直言,对此:“子类重写方法的能力允许类从行为“足够接近”的父类(super class)继承,然后根据需要修改行为。 ”。

我没有看到这样的声明有任何限制,但我想从 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 );
}
}
}

最佳答案

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

关于java - 在重写 equals 方法期间存储中间结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35588018/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com