java - 在给定不可变类层次结构的情况下,重用防御性复制方法的类型安全方法
问题描述
我有一个基类和一个派生类,它们都设计为不可变的(省略了 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()
?
解决方案
我不知道你的意思是不是这样的,在这种情况下,如果你调用 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;
}
}
}
推荐阅读
- mysql - 将 DATE_ADD 与 NOW 合并在 MySQL 上不起作用
- docker - 如何增加 docker 镜像的大小?
- google-cloud-platform - 在终端命令中链接到谷歌云存储桶文件?
- amazon-web-services - K8s 动态卷预置:AWS 上的动态预置不支持 claim.Spec.Selector
- python - 在模块化 python 代码库中使用 Dask LocalCluster()
- java - 使用 Retrofit2 在 Recycleview 中得到空响应?
- algorithm - 如何计算 (31,26) 的汉明码?
- javascript - 如何在 node.js 中创建一个登录页面,该页面指向需要在客户端使用 p5.js 运行的网页?
- java - Appium问题。如果“listen eaddrinuse: address already in use”,如何停止呢?为什么它没有停止?
- c# - 使用 mailkit 检索电子邮件链,仅返回对话的第一封电子邮件