You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:20:26