Builder Pattern下如何为同结构属性设置不同构建器方法名?
解决Lombok Builder多方法名赋值同属性的问题
首先明确:@JsonAlias是Jackson序列化/反序列化的专属注解,仅负责JSON字段与Java属性的映射,和Lombok Builder的构建方法逻辑完全无关,所以用它实现Builder方法别名必然无效。
要让同一个属性支持不同的Builder方法名(比如metric()和state()),可以手动扩展Lombok生成的Builder类,添加自定义的赋值方法:
修改后代码示例
@Value @Builder public static class Input { String name; Source source; } @Value @Builder public static class Source { Metric metric; // 手动扩展Lombok生成的Builder类,添加state方法 public static class SourceBuilder { // 实现和metric()完全一致的逻辑:为metric属性赋值 public SourceBuilder state(Metric metric) { this.metric = metric; return this; } } } @Value @Builder public static class Metric { String ref; }
验证两种构建方式
现在两种写法都能正常生成目标对象:
- 使用原方法名构建:
Input.builder() .name("state") .source(Source.builder() .metric(Metric.builder().ref("ref").build()) .build()) .build();
- 使用别名方法名构建:
Input.builder() .name("state") .source(Source.builder() .state(Metric.builder().ref("ref").build()) .build()) .build();
原理说明
Lombok的@Builder会自动生成静态内部Builder类(如SourceBuilder),我们可以手动为这个类补充方法。这里的state()方法本质就是给metric属性赋值,和自动生成的metric()逻辑完全一致,只是方法名不同,因此两种构建方式最终生成的对象结构完全相同。
内容的提问来源于stack exchange,提问作者RagaSGNur
相关产品推荐
相关产品推荐

