使用Lombok @Builder注解导致默认值无效

本文探讨了Lombok @Builder注解在构建对象时清除默认值的问题,并提供了解决方案,即使用@Builder.Default注解来保留字段的默认初始化值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Builder注解导致默认值无效

使用Lombok注解可以极高的简化代码量,比较好用的注解除了@Data之外,还有@Builder这个注解,它可以让你很方便的使用builder模式构建对象,但是今天发现@Builder注解会把对象的默认值清掉。

像下面这段代码,会导致对象的name属性变为null:

public class BuilderTest {
    @lombok.Builder
    @lombok.Data
    private static class Builder {
        private String name = "1232";
    }

    @Test
    public void test() {
        Builder builder = Builder.builder().build();
        System.out.println(builder.getName());
    }
}
---打印结果---
null

那么不想让这个默认值被清除,就只能用另外一个注解来对属性进行设置:@lombok.Builder.Default 
示例代码如下:

public class BuilderTest {
    @lombok.Builder
    @lombok.Data
    private static class Builder {
        @lombok.Builder.Default
        private String name = "1232";
    }

    @Test
    public void test() {
        Builder builder = Builder.builder().build();
        System.out.println(builder.getName());
    }
}
---打印结果---
1232

需要注意的是@lombok.Builder.Default这个注解是后来才有的,目前已知的是1.2.X没有,1.6.X中有这个注解。
原因分析
使用@Builder注解的代码如下:

@lombok.Builder
class Example {
    private String name = "123";
}

Lombok会生成如下代码:

class Example {
    private String name;

    private Example(String name) {
        this.name = name;
    }

    public static ExampleBuilder builder() {
        return new ExampleBuilder();
    }

    public static class ExampleBuilder {
        private String name;

        private ExampleBuilder() {}

        public ExampleBuilder name(String name) {
            this.name = name;
            return this;
        }

        @java.lang.Override public String toString() {
            return "Example(name = " + name + ")";
        }

        public Example build() {
            return new Example(name);
        }
    }
}

很显然,ExampleBuilder的name没有默认值,导致build之后的Example的name是Null值。
转载自:https://blog.csdn.net/teaandnoodle/article/details/80836125

<think>好的,我现在需要帮助用户了解Lombok@Builder注解使用方法。根据用户提供的引用内容,我需要整理出详细的使用步骤和示例。首先,我应该从基础用法开始,解释如何添加注解到类上,并展示生成的Builder的用法。然后,考虑是否需要覆盖默认配置,比如使用toBuilder方法。接着,用户可能对自定义构建方法感兴趣,比如修改方法名或者添加自定义逻辑。此外,结合其他注解如@Accessors的情况也需要说明,可能涉及到链式调用的问题。 用户提供的引用中有提到@Builder可以生成builder方法,并且从1.18.8版本开始支持builderMethodName参数来抑制生成方法。这一点需要明确说明,可能用户想自定义方法名或者避免冲突。另外,引用[5]提到生成的是空的CardBuilder实例,这可能是一个需要注意的地方,需要指出可能需要手动初始化某些字段。 接下来,我需要确保回答结构清晰,分点列出,每个部分都给出代码示例。比如,基础使用部分用User类作为例子,展示如何构建对象。然后,toBuilder使用示例,说明如何修改现有对象的属性。自定义构建器方法部分,可能需要展示如何用静态方法返回Builder实例,或者如何修改构建步骤。 同时,需要注意引用来源,在适当的位置添加引用标识,比如当提到生成builder类时引用[4],提到toBuilder时引用[2]。另外,用户的问题中提到了相关引用,需要确保正确对应,比如引用[3]中的User类示例,可以在基础使用部分引用。 最后,生成相关问题,需要考虑用户可能进一步想了解的内容,比如与构造函数的对比、处理继承问题、性能影响等。确保问题覆盖用户可能遇到的常见疑问。 现在需要检查是否有遗漏的细节,比如是否需要说明@Builder的默认行为,或者与其他Lombok注解的兼容性。例如,@Accessors注解可能会影响构建器的生成方式,需要指出可能的问题,如链式调用冲突。此外,需要提醒用户注意Lombok版本,某些功能如builderMethodName在特定版本后才支持。 总结步骤: 1. 基础使用:类上添加@Builder,生成构建器,示例代码。 2. 使用toBuilder复制并修改对象。 3. 自定义构建方法,包括方法名和自定义逻辑。 4. 结合其他注解的注意事项。 5. 常见问题解答,如版本要求和冲突处理。 6. 相关问题生成,覆盖进阶使用和潜在问题。</think>### Lombok @Builder 注解使用详解 #### 一、基础使用 在类上添加 `@Builder` 注解后,Lombok 会自动生成一个**构建器类**,提供链式调用方式创建对象。以用户信息类 `User` 为例[^3]: ```java import lombok.Builder; import lombok.Getter; @Builder @Getter public class User { private String name; private int age; private String email; } ``` 调用方式: ```java User user = User.builder() .name("Alice") .age(28) .email("alice@example.com") .build(); ``` 生成的构建器会包含与类属性**一一对应的方法**,每个方法返回构建器实例本身,支持链式调用[^4]。 #### 二、对象修改(toBuilder) 通过 `@Builder(toBuilder = true)` 可基于现有对象创建新实例: ```java User updatedUser = user.toBuilder() .age(29) // 修改年龄 .email("alice_new@example.com") // 更新邮箱 .build(); ``` 此时会生成包含原始对象属性的新 `User` 实例[^2]。 #### 三、自定义构建器 1. **修改构建方法名**(Lombok v1.18.8+): ```java @Builder(builderMethodName = "hiddenBuilder") public class Product { private String id; } ``` 调用时需使用自定义名称: ```java Product product = Product.hiddenBuilder().id("P1001").build(); ``` 2. **添加自定义构建逻辑**: ```java @Builder public class Order { private String orderId; private LocalDateTime createTime; public static class OrderBuilder { public OrderBuilder() { createTime(LocalDateTime.now()); // 自动设置创建时间 } } } ``` #### 四、组合注解注意事项 与 `@Accessors(chain = true)` 组合使用时,可能因**方法名冲突**导致编译错误: ```java @Builder @Accessors(chain = true) public class Account { // 链式setter与构建器方法会冲突 } ``` 此时需移除 `@Accessors` 或调整 Lombok 配置。 #### 五、常见问题解答 1. **默认值设置**: ```java @Builder.Default private int status = 1; // 字段初始化默认值 ``` 2. **版本要求**: - `toBuilder` 功能需 Lombok v1.16.18+ - `builderMethodName` 参数需 v1.18.8+[^1] 3. **继承问题**: 父类使用 `@Builder` 时,子类需手动添加 `@Builder` 并调用 `super()` 方法初始化父类字段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值