依赖版本
<!--elastic-search java客户端-->
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.15.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>
场景
要修改TemplateMapping的成员,比如设置order为其他值
链接:点我看类结构
实现
实现方法有很多,但本人希望尽可能符合其设计思想:
- 该类所有成员用 final 标识,设计者不希望构建完成后的对象被修改(部分成员如下)
- 建造者的build()方法只能被调用一次(如下方法 继承自ObjectBuilderBase)
思路如下:
- 反射不考虑,不在原对象上修改,而是构建新对象
- 由于构建对象完成后无法修改,在构建期完成复制和修改操作即可
代码:
/**
* 复制 TemplateMapping<br/>
* builder 内部会检测自己是否被使用过 <br/>
* 鉴于 builder() 只能调用一次 <br/>
* 选择用修改代替复制 <br/>
*
* @return 新的构件者对象
* @author flycat
*/
private TemplateMapping copyTemplateMapping(
TemplateMapping oldTemplateMapping,
UnaryOperator<TemplateMapping.Builder> newTemplateMapping
) {
return newTemplateMapping.apply(new TemplateMapping.Builder()
// index_patterns
.indexPatterns(oldTemplateMapping.indexPatterns())
// order
.order(oldTemplateMapping.order())
// version
.version(oldTemplateMapping.version())
// settings
.settings(oldTemplateMapping.settings())
// mappings
.mappings(oldTemplateMapping.mappings())
// aliases
.aliases(oldTemplateMapping.aliases())
).build();
}
使用:
copyTemplateMapping(templateMapping, builder -> builder
.order(indexGroupDetail.getIndexGrp().length())
.indexPatterns(indexGroupDetail.getIndexGrp() + "*")
.version(versionFromTimestamp())