Lombok常用注解的使用总结

Lombok是一款在编译阶段修改增强Java类的工具,通过注解方式自动生成getter、setter等代码,提升开发效率。本文介绍Lombok的常见用法,如@Builder和@SuperBuilder注解,以及如何引入和配置Lombok。

Lombok是什么?

一个在编译阶段修改增强Java类的工具,使用方式基于注解,常用于:

  • 为Java POJO生成属性对应的getter,setter等
  • 为Java POJO生成builder构造器模式的实现
  • 为Java类自动添加其他重复性代码,比如日志记录的声明代码可以通过@Slf4j注解添加

项目中是否引入Lombok一直是个存在争议,它的主要优势在于消除Java类的部分臃肿代码,提高开发效率,降低代码维护成本;缺点是需要IDE插件支持,需要团队统一规范,另外某些注解生成的隐性实现可能导致问题跟踪调试困难。

不使用Lombok,IDE也可以自动生成getter,setter代码,但Lombok除了getter,setter还有@Builder和@SuperBuilder等非常实用的自动实现。比如你可以将一个POJO类转化为builder模式,如果你又有一个子类,子类的构造器还要继承自父类,写起来就费劲了。而通过Lombok只需要一个@SuperBuilder注解(v1.18.2+版本支持)。

如何引入Lombok

  • 引入依赖,以gradle为例:
compile("org.projectlombok:lombok:1.18.4")
  • IDE中安装插件,以IDEA为例: Settings -> Plugins -> 搜索Lombok Plugin,点击安装

       

 

  • IDEA中配置启用注解的处理: Enable annotation processing (不开启将导致编译错误)

 

Lombok常见用法

  • 在属性上添加的注解: @Getter、@Setter、@NonNull等:

示例代码:

public class Parent {
    // get,set添加在指定属性上
    @Getter @Setter private int id;
    @Getter @Setter private String name;
}
  • 在类上添加的注解:

    - @Data 注解组合,含@Setter、@Getter、@RequiredArgsConstructor、@EqualsAndHashCode等注解
    - 构造函数注解: @NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor
    - 构造器builder注解: @Builder、@SuperBuilder
    - 日志声明的注解: @Slf4j 等

示例代码:

@Data
public class Child extends Parent {
    private String ext;
}

@Setter@Getter或@Data注解添加后可以通过new创建对象并调用getter,setter方法:

Child c1 = new Child();
c1.setId(1);  
System.out.println(c1.getId());

Builder构造器模式与继承

构造模式的链式调用写起来很方便,自己实现构造模式要在POJO类中写较多代码,尤其是需要继承父类的builder时。
Lombok的@Builder注解可以方便的支持构造模式
示例代码:

@Builder
public class Child extends Parent {
    private String ext;
}

调用方法:

Child c1 = Child.builder().ext("子类属性ext").build();
System.out.println(c1.getExt());

此例中的链式调用仅有ext()属性,即使给父类Parent也添加@Builder注解也依然不能链式调用id()和name(),自己去写builder的实现也是这样,类是继承的,但类中的builder并无继承关系,而实际开发场景中我们一般都需要让子类的builder继承父类builder的行为。

Lombok在v1.18.2版本中针对这个问题增加了@SuperBuilder注解,子类和父类中都添加@SuperBuilder注解,子类builder即可继承父类builder。

代码示例:

@SuperBuilder
public class Parent {
    // get,set添加在指定属性上
    @Getter @Setter private int id;
    //如果需要让build出的对象属性使用默认值,需要添加@Builder.Default注解
    @Builder.Default
    @Getter @Setter private String name = "unknown";
}

@SuperBuilder
@Data
public class Child extends Parent {
    private String ext;
}

调用示例:

Child c1 = Child.builder().id(1).name("名称").ext("子类属性ext").build();
System.out.println(c1.getId());

需要注意的是: 关于builder的继承,Lombok Plugin尚未更新支持@SuperBuilder,所以以上写法在IDE下还会提示编译错误,等更新吧,或者用稍微蹩脚一点的解决方案:Lombok’s @Builder annotation and inheritance


Diboot - 简单高效的轻代码开发框架

<think>好的,我现在需要回答用户关于Lombok中@Builder注解使用方法的问题。首先,我需要回忆一下@Builder的作用和基本用法。@Builder是Lombok提供的一个注解,用于简化Java中构建对象的代码,特别是当对象有很多可选参数时,可以通过流式调用的方式设置属性,避免编写大量构造方法或setter方法。 首先,我应该介绍@Builder的基本使用步骤。通常,使用@Builder需要在类上添加@Builder注解,这样Lombok会生成一个内部的Builder类,包含链式方法来设置属性,最后通过build()方法创建对象。需要注意的是,@Builder默认会为类生成一个全参构造方法,并且可能需要配合其他注解如@AllArgsConstructor、@NoArgsConstructor,特别是在需要无参构造的情况下。 接下来,需要说明@Builder的常用场景,比如当类有多个可选参数时,传统的构造方法可能会导致构造方法爆炸,而@Builder可以更清晰地设置参数。同时,可能需要提到@Builder的一些参数,比如builderMethodName(自定义构建方法名)、buildMethodName(自定义build方法名)、builderClassName(自定义Builder类名)等,这些可以让用户更灵活地使用。 然后,需要注意@Builder的一些限制和常见问题。例如,@Builder生成的Builder类不会包含默认值,除非使用@Builder.Default注解来指定默认值。另外,如果类中有final字段,可能需要配合@RequiredArgsConstructor或其他注解来确保正确初始化。 还需要给出示例代码,展示如何在类上使用@Builder,以及如何通过Builder模式创建对象。比如定义一个User类,使用@Builder注解,然后通过User.builder().name("张三").age(20).build()来创建对象。 另外,可能需要提到@Builder与@Data、@AllArgsConstructor等注解的配合使用,因为有时候用户可能需要其他Lombok注解来补充功能。例如,@Builder通常需要类有一个全参构造方法,而@AllArgsConstructor可以生成这个构造方法,但如果类中有final字段,可能需要@RequiredArgsConstructor。 还要注意,当使用@Builder时,如果类中已经手动定义了构造方法,可能会影响Lombok生成的Builder类,需要确保构造方法与@Builder兼容。此外,内部类使用@Builder时的注意事项,比如静态内部类和非静态内部类的区别。 最后,总结@Builder的优势,比如代码简洁、可读性高,减少样板代码,同时提醒用户注意可能的陷阱,比如默认值处理、构造方法的影响等。 现在需要将这些思路整理成结构化的回答,并确保覆盖基本用法、参数配置、示例代码、注意事项等内容。同时,按照用户要求,在回答末尾生成3-5个相关问题。 </think>Lombok的`@Builder`注解用于**快速生成流式构建对象的工具类(Builder)**,避免手动编写繁琐的构造方法或`setter`代码,尤其适合属性较多、需灵活组合参数的类。以下是其核心用法及注意事项: ### 一、基础使用步骤 #### 1. 注解类定义 在目标类上添加`@Builder`注解Lombok会自动生成一个静态内部`Builder`类,包含链式方法设置属性,最终通过`build()`方法创建对象。 **示例代码**: ```java import lombok.Builder; @Builder public class User { private String name; private Integer age; private String email; } ``` #### 2. 使用Builder构建对象 通过类名调用`builder()`方法获取`Builder`实例,链式调用属性设置方法(方法名与类属性名一致),最后调用`build()`生成对象: ```java User user = User.builder() .name("张三") // 设置name属性 .age(20) // 设置age属性(可选) .email("zhangsan@example.com") // 设置email属性(可选) .build(); // 最终构建User对象 ``` ### 二、关键特性与配置参数 `@Builder`支持通过注解参数自定义生成逻辑,常用参数如下: | 参数名 | 作用 | 示例 | |-----------------------|----------------------------------------------------------------------|----------------------------------------------------------------------| | `builderMethodName` | 自定义获取Builder实例的方法名(默认`builder()`) | `@Builder(builderMethodName = "create")` → 通过`User.create()`获取Builder | | `buildMethodName` | 自定义构建对象的方法名(默认`build()`) | `@Builder(buildMethodName = "done")` → 通过`builder.done()`生成对象 | | `builderClassName` | 自定义Builder类的类名(默认`UserBuilder`) | `@Builder(builderClassName = "UserCreator")` → Builder类名为`UserCreator` | | `toBuilder` | 生成一个基于当前对象的Builder(需配合`@AllArgsConstructor`) | `@Builder(toBuilder = true)` → 对象可调用`user.toBuilder()`复制并修改属性 | ### 三、处理默认值与必选参数 #### 1. 默认值设置 `@Builder`默认不会处理属性的默认值(直接赋值的默认值会被覆盖),需通过`@Builder.Default`注解显式声明: ```java @Builder public class User { private String name; @Builder.Default // 声明默认值(未设置时使用) private Integer age = 18; // 若未调用.age(),则age=18 private String email; } ``` #### 2. 必选参数强制校验 若需某些参数为必选(构建时必须设置),可配合`@NonNull`注解Lombok或Jakarta),未设置时会抛出`NullPointerException`: ```java import jakarta.validation.constraints.NotNull; @Builder public class User { @NotNull // 必选参数 private String name; private Integer age; // 可选参数 } // 未设置name时,build()会抛出NPE User user = User.builder().age(20).build(); // 报错:name cannot be null ``` ### 四、与其他Lombok注解的配合 #### 1. 无参构造方法缺失问题 `@Builder`默认生成的Builder依赖类的**全参构造方法**(Lombok会自动生成),但如果需要无参构造(如ORM框架反序列化),需显式添加`@NoArgsConstructor`: ```java import lombok.Builder; import lombok.NoArgsConstructor; @Builder @NoArgsConstructor // 生成无参构造(与@Builder兼容) public class User { private String name; private Integer age; } ``` #### 2. 与`@Data`/`@Getter`/`@Setter`组合 `@Builder`可与`@Data`(包含`@Getter`/`@Setter`)等注解共存,不影响功能: ```java import lombok.Builder; import lombok.Data; @Data @Builder public class User { private String name; private Integer age; } ``` ### 五、注意事项 1. **属性顺序无关性**:Builder的链式调用不依赖属性顺序,可灵活设置任意属性(可选参数可省略)。 2. **不可变对象**:`@Builder`生成的对象默认是可变的(通过`setter`修改),若需不可变对象,需配合`@Value`注解(生成不可变类)。 3. **嵌套对象构建**:支持嵌套类的Builder(需内部类为静态): ```java @Builder public class Order { @Builder // 内部类需为static(Lombok自动处理) public static class Product { private String productId; } } // 使用:Order.Product.builder().productId("123").build() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值