我有一些第三方代码,其中包含许多具有破坏的equals()和哈希代码实现的类。我无法更改第三方代码但严重需要equals方法。为了克服这个问题,我提出了以下方法:
1)创建一个EqualsUtility,它有一堆重载的静态equals()方法。
问题:随着第三方代码的增长,该类将变得非常大。
2)为所有第三方类创建适配器类并编写equals方法。
问题:创建了太多新类。
有没有第三种更干净的方法来做到这一点。
答案 0 :(得分:2)
您可以尝试使用某些第三方lib检查对象是否相等,例如使用ApacheCommoms EqualsBuilder。但这可能不是一个很好的解决方案,因为它使用反射进行比较。此外,它对哈希码实现没有帮助。
IMO,扩展基类和重写equals和hashcode方法是可以忍受的。任何其他解决方案,包括方面,用于深度对象比较的第三方库,一些代理对象,都不利于性能,在某些情况下也无法理解您的代码。
答案 1 :(得分:0)
查看AspectJ。它是面向Aspect的Java编程库,让您完全按照自己的意愿行事。您描述了一个名为切入点的实体,在这种情况下大致对应于库对象上equals()方法的方法调用。
然后编写在命中切入点时执行的代码。您可以编写不同类型的切入点。因此,例如,您可以在equals()方法之前,在equals()方法之后或在equals()方法周围执行代码。如果你写了around()类型,你可以选择处理你自己的调用或做一些工作,然后调用原始方法。
你可以做一个around()并重写equals方法,这样你的情况就是正确的。
非常强大的东西。