首页 > 解决方案 > 在给定不可变类层次结构的情况下,重用防御性复制方法的类型安全方法

问题描述

我有一个基类和一个派生类,它们都设计为不可变的(省略了 ctor 和 getter):

public class PageQuery<T> {
    private final T queryFilter;
    private PageCond pageCond; // pagination parameter

    // E withPageCond(PageCond newPageCond) { 
    //    return a brand new copy of `this` with `pageCond` replaced with `newPageCond`
    //    that can be reused across class hierarchy
    // }
}

public class PageSortQuery<T> extends PageQuery<T>{
    private final SortCond sortCond; // sorting parameter
}

如何向基类添加一个返回防御性副本的方法,this以便此层次结构中的所有类都可以从中受益?有没有办法在没有的情况下完成它clone()

标签: javaoopinheritanceimmutability

解决方案


我不知道你的意思是不是这样的,在这种情况下,如果你调用 withFilter 方法,原点不会改变。

@AllArgsConstructor
public class Query <T> {
  @Getter
  private final String name;
  @Getter
  private final Predicate<T> filter;

  public Query<T> withFilter(Predicate<T> filter){
    return new DelegatingQuery<T>(this){
      @Override
      public Predicate<T> getFilter() {
        return Query.this.filter;
      }
    };
  }

  static class DelegatingQuery<T> extends Query<T>{
    @Delegate
    private final Query<T> query;

    public DelegatingQuery(Query<T> query) {
      super(query.name,query.filter);
      this.query = query;
    }
  }

}

推荐阅读