【ES Java Client】修改建造者模式的对象成员

98 阅读1分钟

依赖版本

<!--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())

参考