Skip to content

前言

Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java bean代码的冗长,虽然IDE也可以帮我们自动生成Get、Set方法,但代码里充斥着这些方法也会显得不直观。

Lombok通过注解实现帮我们简化代码,比如下边这段代码:

java
public class GetSetTest {

    private String name;

    private LocalDate date;

    public String getName() {
        return this.name;
    }

    public LocalDate getDate() {
        return this.date;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setDate(LocalDate date) {
        this.date = date;
    }
}

而使用lombok只需要添加一个注解即可达到一样的效果:

java

@Data
public class GetSetTest {
    
    private String name;
    
    private LocalDate date;
}

Lombok本质上是在编译时进行解析,给java文件增加新的代码。

引用

Lombok引用非常简单,首先需要引入Lombok包:

java
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
        </dependency>

再在你的IDE中安装Lombok插件,就可以开始了!

使用

@NonNull

该注解用于标注字段、方法、方法参数上,在类初始化时会检查是否为空,否则抛出空指针异常。

@Getter @Setter

正如这两个单词所代表的语义,用以生成字段的get和set方法。该注解可以标注在类上,也可以标注在字段上。

@ToString

**@ToString ******注解用于自动生成便于查看的类的ToString方法,该注解有以下几个可选参数:

  • includeFieldNames  boolean 类型,默认为true,是否包含字段,
  • exclude String[]类型,不包含的字段
  • of String[]类型,包含的字段
  • callSuper
  • doNotUseGetters

@EqualsAndHashCode

@EqualsAndHashCode注解作用于类上,该注解会自动生成一个equals和hashCode方法,其中equals方法会根据所有的字段值判断equals的结果

java
@EqualsAndHashCode
public class EqualsAndHashCodeTest {

    private String name;
}

// 实际生成的代码
public class EqualsAndHashCodeTest {

    private String name;

    public boolean equals(final Object o) {
        if (o == this) return true;
        if (!(o instanceof EqualsAndHashCodeTest)) return false;
        final EqualsAndHashCodeTest other = (EqualsAndHashCodeTest) o;
        if (!other.canEqual((Object) this)) return false;
        final Object this$name = this.name;
        final Object other$name = other.name;
        if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;
        return true;
    }

    protected boolean canEqual(final Object other) {
        return other instanceof EqualsAndHashCodeTest;
    }

    public int hashCode() {
        final int PRIME = 59;
        int result = 1;
        final Object $name = this.name;
        result = result * PRIME + ($name == null ? 43 : $name.hashCode());
        return result;
    }
}

构造函数相关注解

  • @NoArgsConstructor@NoArgsConstructor注解会生成一个无参构造器,**但对于final字段或有@NoNull注解的字段,使用该注解会报错。**可以通过@NoArgsConstructor(force = true)参数,强制执行创建无参数构造器,这时final字段会初始化为0/false/null
  • @RequiredArgsConstructor

@RequiredArgsConstructor注解与@NoArgsConstructor相对,在默认情况下会生成一个无参构造器,在有final字段或有@NoNull注解的字段,会生成带有这些字段的构造器。

java
@RequiredArgsConstructor
public class ArgsConstructorTest {

    @NonNull
    private String name;

    private int age;
    
}
// 实际生成的代码
public class ArgsConstructorTest {

    @NonNull
    private String name;

    private int age;

    public ArgsConstructorTest(String name) {
        this.name = name;
    }
}

@AllArgsConstructor该注解会生成一个全参数构造器。

注意:

这三个构造器注解并不会影响类中原先自己书写的构造器。

@Data

@Data是一个集合体。包含Getter,Setter``,RequiredArgsConstructor,ToString,EqualsAndHashCode

@Builder

生成可以使用构造器模式的代码,是类字段赋值变得简洁

java
@Builder
@Data
public class BuilderTest {
    private String name;

    private int age;
    
    private String type;
}

使用该注解后,类字段就可以像下边这样赋值:

java
        BuilderTest builderTest = BuilderTest.builder()
                .age(1)
                .name("")
                .type("")
                .build();