覆盖破碎的平等

Overriding broken equals

我有一些第三方代码,其中有很多 classes 带有损坏的 equals() 和哈希码实现。我无法更改第三方代码,但非常需要 equals 方法。为了克服这个问题,我想出了以下方法:

1) 创建一个 EqualsUtility,它有一堆重载的静态 equals() 方法。

问题: class会随着第三方代码的增长变得很大

2) 为所有第三方 classes 创建适配器 classes 并编写一个 equals 方法。

问题:创建的新 class 太多。

是否有第三种更简洁的方法。

查看 AspectJ。它是面向 Java 的面向方面的编程库,可让您完全按照自己的意愿行事。您描述了一个称为切入点的实体,在这种情况下,它大致对应于对库对象的 equals() 方法的方法调用。

然后您编写在命中该切入点时执行的代码。您可以编写不同类型的切入点。因此,例如,您可以让代码在 equals() 方法之前、equals() 方法之后或 equals() 方法周围执行。如果你写一个 around() 类型,你可以选择自己处理调用或者做一些工作然后调用原始方法。

您可以执行 around() 并重写 equals 方法,使其适合您的情况。

非常强大的东西。

您可以尝试使用某些第 3 方库检查对象是否相等,例如使用 ApacheCommoms EqualsBuilder。但这可能不是一个很好的解决方案,因为它使用反射进行比较。此外,它对哈希码的实现没有帮助。

IMO,扩展基础 类 并覆盖 equals 和 hashcode 方法是可取的。任何其他解决方案,包括方面、用于深度对象比较的第 3 方库、一些代理对象,都不利于性能,在某些情况下也不利于理解您的代码。