如何在Java中装饰对象

And*_*ite 5 java decorator

快速背景

我有两个(大)POJO列表被传递到一个方法,我需要确保两个列表的唯一性.我能看到的最好的解决方案是构造两个集合并检查它们的交集是否为空.

问题

对于这种方法的情况下,仅此一点方法,我需要重写equalshashcodePOJO的方法有问题.

我在寻找什么

这似乎是装饰现有物体的主要候选者.我看过Guava的ForwardingObject,但它似乎最适合委托实现给定接口的对象,这不是我的情况.总的来说,我正在寻找一个解决方案......

  1. 避免处理大型POJO(复制构造函数)中的所有字段.
  2. 易于理解和维护
  3. 为了这一方法,避免创建一个扩展POJO的全新类

rfe*_*eak 3

我只想参加包装类。

创建一个在构造函数中使用 POJO 实例化的新类。它不复制 POJO,只是保留对原始 POJO 的引用。然后在该包装类中编写您喜欢的 equals 和 hashcode。

像这样的东西:

public class MySpecialWrapper{
  private final BigPojo delegate;

  public MySpecialWrapper(BigPojo pojo){
    this.delegate = pojo;
  }

  public int hashCode(){
    //insert special impl here.
  }

  public boolean equals(Object o){
    //insert special impl here.
  }
}
Run Code Online (Sandbox Code Playgroud)

将包装类的实例放入您的集合中,并使用它进行唯一性验证。如果您需要在发生故障时访问有问题的 POJO,请添加访问器方法 (getDelegate)。