如何让Lombok Builder仅用部分参数生成对象并自动生成UUID
问题描述
我用Lombok注解定义了如下Technology实体类:
@Entity @Data @NoArgsConstructor @Builder public class Technology { @Id private UUID uuid; private String name; }
目前创建对象时必须手动指定uuid:
Technology t = Technology.builder() .uuid(UUID.randomUUID()) .name("tName") .build()
我希望简化成以下写法,让uuid由实体类自动生成:
Technology t = Technology.builder() .name("tName") .build()
我原本以为@Builder会用全参构造器初始化对象,但不知道如何只传部分参数。尝试自定义了构造函数:
public Technology(String name) { uuid = UUID.randomUUID(); this.name = name; }
但使用简化的Builder代码时,仍然提示未设置uuid,该怎么解决?
解决方案
方法1:用@Builder.Default指定字段默认值
这是最简洁的方案,直接在uuid字段上添加@Builder.Default注解,把UUID生成逻辑设为默认值。Lombok的@Builder会识别这个注解,当你没有手动设置uuid时,自动使用默认逻辑生成:
@Entity @Data @NoArgsConstructor @Builder public class Technology { @Id @Builder.Default private UUID uuid = UUID.randomUUID(); private String name; }
这样既可以用Technology.builder().name("tName").build()自动生成uuid,也支持手动调用.uuid(xxx)覆盖默认值,完全满足需求。
方法2:自定义Builder内部类
如果需要更灵活的控制逻辑,可以手动编写Builder类,在build()方法里处理uuid的生成逻辑:
@Entity @Data @NoArgsConstructor public class Technology { @Id private UUID uuid; private String name; public static class Builder { private UUID uuid; private String name; public Builder name(String name) { this.name = name; return this; } public Builder uuid(UUID uuid) { this.uuid = uuid; return this; } public Technology build() { Technology tech = new Technology(); // 优先用手动设置的uuid,否则自动生成 tech.uuid = this.uuid != null ? this.uuid : UUID.randomUUID(); tech.name = this.name; return tech; } } public static Builder builder() { return new Builder(); } }
这种方式完全自定义了Builder的行为,适合有特殊逻辑需求的场景。
为什么自定义构造器没用?
你之前自定义的单参构造器不会被Lombok的@Builder使用,因为@Builder默认是基于全参构造器或者字段来生成Builder类的,它不会自动关联你自定义的构造函数。所以即使写了单参构造器,Builder依然会要求你设置所有非默认字段,这就是为什么会提示未设置uuid。
内容的提问来源于stack exchange,提问作者spozzi
相关产品推荐
相关产品推荐

