Spring Boot扩展包:Lombok

Lombok是一个在Spring Boot工程中常用的开发者工具扩展包,它能以简单的注解的形式简化java代码,提高开发人员的开发效率。

Lombok是一个Java库,旨在通过自动化一些繁琐的编码任务来简化Java代码的编写。它通过提供一组注解来实现,这些注解可以自动生成通常需要手动编写的代码,如getter、setter、构造函数、equals、hashCode等。这有助于减少样板代码,提高代码的可读性和维护性

Lombok官网

1 安装

1.1 添加Maven依赖

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>

1.2 安装Idea插件

点击Preferences..->Plugins, 搜索Lombok安装。

编译时出错,可能是没有enable注解处理器。Annotation Processors > Enable annotation processing。设置完成之后程序正常运行。

2 使用

2.1 @Getter和@Setter

  • @Getter: 为类中的字段生成相应的getter方法。
  • @Setter: 为类中的字段生成相应的setter方法。
import lombok.Getter;
import lombok.Setter;

public class User {
   @Getter
   @Setter
   private Long ID;

   @Getter
   @Getter
   private String username;
}

2.2 @ToString

自动生成toString()方法,以便在日志记录和调试时方便查看对象的内容。

import lombok.ToString;

@ToString
public class User {
    private Long ID;
    private String username;
}

2.3 @NoArgsConstructor和@AllArgsConstructor:

  • @NoArgsConstructor: 生成无参构造函数。
  • @AllArgsConstructor: 生成包含所有字段的参数构造函数。
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
public class User {
    private User ID;
    private String username;
}

2.4 @EqualsAndHashCode

自动生成equals()和hashCode()方法,用于比较对象的相等性和生成哈希码。

import lombok.EqualsAndHashCode;

@EqualsAndHashCode
public class User {
    private Long ID;
    private String username;
}

2.5 @Data

为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。

import lombok.Data;

@Data
public class User {
    private Long ID;
    private String username;
}

2.6 @Builder

@Builder注解为类生成相对略微复杂的构建器API。

  • 其作用于类,将其变为建造者模式;
  • 可以以链的形式调用;
  • 初始化实例对象生成的对象是不可以变的,可以在创建对象的时候进行赋值;
  • 如果需要在原来的基础上修改可以加set方法,final字段可以不需要初始化;
  • 它会生成一个全参的构造函数。

属性:

  • @Builder.Default: 非final的字段可以有默认值;
  • builderMethodName: 指定创建内部静态类的方法名,默认值为build;
  • buildMethodName: 指定创还能实体类的方法名,默认为build;
  • builderClassName: 指定内部的静态类名,默认值为"",默认创建的类名thisClassBuilder
  • toBuilder: 设置为true可以对这个对象拷贝生成新的对象,可以再修改,默认为false。
  • access: 设置builderMethodName的访问权限修饰符,默认为public,共有PUBLIC、MODULE、PROTECTED、PACKAGE、PRIVATE;
  • setterPrefix: 设置setter方法的前缀,默认为"";

示例:

import lombok.Builder;

@Builder(builderMethodName="builder", buildMethodName="build", builderClassName="", toBuilder=true, access=AccessLevel.PUBLIC, setterPrefix="")
public class Person {
    @Builder.Default
    private String name = "刘亦菲";

    private String sex;

    private final Integer age = 18; // final 字段加不加 Default 都可以初始化成功

    public static void main(String[] args) {
        Person person = Person.builder().build();   // 如果没有加 Default,那么输出的 name 结果是 null。
        /**
         * 类似于拷贝,修改了 name 值,age 值还是原来的
         * 如果 toBuilder = false,则没有 toBuilder 方法
         */
        person = yifei.toBuilder().name("李四").build();
    }
}

支持泛型构建

@Builder
public class Person<T> {
    public void person(Person<T> yi) {
        person = Person.<T>builder().builder();
    }
}
2.6.1 无法定义无参数构造的解决办法
  • @AllArgsConstructor注解
  • 或者加@Tolerate注解
2.6.2 原理

@Builder做了什么

  • 创建一个名为 ThisClassBuilder 的内部静态类,并具有和实体类相同的属性(称为构建器)
  • 在构建器中:对于目标类中的所有的属性和未初始化的 final 字段,都会在构建器中创建对应属性
  • 在构建器中:创建一个无参的 default 构造函数
  • 在构建器中:实体类中的每个参数,都会对应创建类似于 setter 的方法,方法名与该参数名相同。 并且返回值是构建器本身(便于链式调用)
  • 在构建器中:会创建一个 build 方法,调用 build 方法,就会根据设置的值进行创建实体对象
  • 在构建器中:会生成一个 toString 方法
  • 在实体类中:会创建一个 builder 方法,它的目的是用来创建构建器
@Builder
public class User {
    private String username;
    private String password;
}

编译后相当于

public class User {
    private String username;
    private String password;

    User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public static User.UserBuilder builder() {
        return new User.UserBuilder();
    }

    public static class UserBuilder {
        private String username;
        private String password;

        UserBuilder() {}

        public User.UserBuilder username(String username) {
            this.username = username;
            return this;
        }

        public User.UserBuilder password(String password) {
            this.password = password;
            return this;
        }

        public User build() {
            return new User(this.username, this.password);
        }

        public String toString() {
            return "User.UserBuilder(username=" + this.username + ", password=" + this.password + ")";
        }
    }
}

3 Lombok的优缺点

3.1 优点

  • 能通过注解的形式自动生成构造器,getter/setter,equals,hashCode,toString等方法,提高了一定开发效率;
  • 让代码变得简洁,不用过多地去关注相应的方法;
  • 属性做修改时,也简化了维护这些属性所生成的getter/setter方法;

3.2 缺点

  • 不支持多种参数的构造器的重载;
  • 虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度。

发表回复

您的电子邮箱地址不会被公开。