Lombok 介绍及详细使用方法示例

一、前言

在 Java 中,最常见的封装莫过于 getset 方法了,无论是 Intellij idea 还是 Eclipse,都提供了快速生成 getset 方法的快捷键,使用起来很是方便,但其实,我们还有更方便的办法,就是今天的主角:Lombok

1、Lombok 是什么?

Lombok 是一个通过注解以达到减少代码的Java库,如通过注解的方式减少 getset,构造方法等。

2、如何安装Lombok?

在 Lombok 官网中,有一个 install 选项,我们点开它会看到多种安装方式:

lombok-install.png

以 maven 为例,在自己的项目里添加 lombok 的编译支持,在 pom 文件里面添加 dependency

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.2</version>
    <scope>provided</scope>
</dependency>

lombok 不断更新,详情查看:lombok 中央库(https://mvnrepository.com/artifact/org.projectlombok/lombok)

但无论是 Intelij idea,还是 Eclipse 默认情况下都是不能识别的,我们还要让 idea 识别起来,那就要安装相对应都插件支持了。

二、Intellij IDEA 安装配置 lombok

1、安装 lombok

打开 IDEA 的 Settings 面板,并选择 Plugins 选项,然后点击 “Browse repositories

lombok-idea-install.png

在输入框输入”lombok”,得到搜索结果,点击安装,然后安装提示重启 IDEA,安装成功;

2、配置注解处理器

同样我们在 Settings 设置页面,我们点击 Build,Execution,Deployment --> 选择 Compiler --> 选中 Annotation Processors,然后在右侧勾选 Enable annotation processing 即可。

三、Lombok 如何使用?

在实体类上引入相关的注解就行,如下示例:

import lombok.Data;

@Data
public class Student {

    private String name;
    private int age;
    private String male;
    private String studentNo;
}

四、Lombok 有哪些注解?

  • @Data

  • @Setter

  • @Getter

  • @Log

  • @Log4j

  • @Log4j2

  • @AllArgsConstructor

  • @NoArgsConstructor

  • @EqualsAndHashCode

  • @NonNull

  • @ToString

  • @RequiredArgsConstructor

  • @Value

  • @SneakyThrows

  • @Synchronized

  • @Cleanup

1、@Data

注解在 类 上;提供类所有属性的 get 和 set 方法,此外还提供了 equalscanEqualhashCodetoString 方法。

lombok-example-data.png

2、@Setter

  • 注解在 属性 上;为单个属性提供 set 方法;

  • 注解在 类 上,为该类所有的属性提供 set 方法;

两者都提供默认构造方法。

lombok-example-setter.png

lombok-example-setter-2.png

3、@Getter

功能同上面 @Setter 注解

4、@Log

注解在 类 上;为类提供一个 属性名为 log 的日志对象,提供默认构造方法。

lombok-example-log.png

5、@Log4j

注解在 类 上;为类提供一个 属性名为 log 的 log4j 日志对象,提供默认构造方法。

lombok-example-log4j.png

6、@Log4j2

功能同上面 @Log4j 注解,引入的包不同

lombok-example-log4j2.png

7、@AllArgsConstructor

注解在 类 上;为类提供一个全参的构造方法,加了这个注解后,类中不提供默认构造方法了。

lombok-example-allArgsConstructor.png

8、@NoArgsConstructor

注解在 类 上;为类提供一个无参的构造方法。

lombok-example-noArgsConstructor.png

9、@EqualsAndHashCode

注解在 类 上, 可以生成 equalscanEqualhashCode 方法。

lombok-example-equalsAndHashCode.png

10、@NonNull

注解在 属性 上,会自动在 gettersetter 上产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常,也会有一个默认的无参构造方法。

lombok-example-nonNull.png

11、@ToString

这个注解用在 类 上,可以生成所有参数的 toString 方法,还会生成默认的构造方法。@ToString 有多个属性可以进一步设置:

  • callSuper:是否输出父类的 toString 方法,默认为 false

  • includeFieldNames:是否包含字段名称,默认为true

  • exclude:排除生成 tostring 的字段

  • doNotUseGetters: = 是否直接访问字段,而不是在生成tostring方法时使用getter(如果可用),默认为 false

lombok-example-toString.png

lombok-example-toString-2.png

12、@RequiredArgsConstructor

这个注解用在 类 上,使用类中所有带有 @NonNull 注解的或者带有 final 修饰的成员变量生成对应的构造方法。

13、@Value

这个注解用在 类 上,会生成含所有参数的构造方法,get 方法,此外还提供了 equalshashCodetoString 方法。

lombok-example-value.png

14、@SneakyThrows

这个注解用在 方法 上,可以将方法中的代码用 try-catch 语句包裹起来,捕获异常并在 catch 中用Lombok.sneakyThrow(e) 把异常抛出,可以使用 @SneakyThrows(Exception.class) 的形式指定抛出哪种异常,也会生成默认的构造方法,可以指定多个异常类型。

lombok-example-sneakyThrows.png

15、@Synchronized

这个注解用在 类方法 或者 实例方法 上,效果和 synchronized 关键字相同,区别在于锁对象不同,对于类方法和实例方法,synchronized 关键字的锁对象分别是类的 class 对象和 this 对象,而 @Synchronized 的锁对象分别是 私有静态final 对象 lock 和 私有 final 对象 lock,当然,也可以自己指定锁对象,此外也提供默认的构造方法。

该注解自动添加到同步机制,有生成的代码并不是直接锁方法,而是锁代码块,作用范围是方法上

lombok-example-synchronized.png

16、@Cleanup

这个注解用在 变量 前面,可以确保已分配的资源被释放,例如IO的连接关闭,默认是调用资源的 close() 方法,如果该资源有其它关闭方法,可使用 @Cleanup(“methodName”) 来指定要调用的方法,也会生成默认的构造方法。

lombok-example-cleanup.png

当然从1.7开始jdk已经提供了try with resources的方式自动回收资源

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

扩展配置

扩展几个不常用的注解用法,了解一下就好,一般我们项目中也不会真的这么干。

1、@Accessors

  • 注解在 属性 上;为单个属性生效;

  • 注解在 类 上,为该类所有的属性生效;

  • chain:设置为 true,生成的 setter 将返回 this(而不是void),通过这个配置我们可以像 jquery 一样愉快的链式编程了。默认为 false

  • fluent:设置为 true,生成的 getter 和 setter 将不会使用标准的 getis 或 set 进行前缀,相反,方法将使用与字段相同的名称(减去前缀)。默认为 false

  • prefix:给有前缀的属性字段,进行 gettersetter 过滤。

2、@FieldDefaults

设置缺省的字段修饰符。直接上代码吧!

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.experimental.FieldDefaults;
import lombok.experimental.NonFinal;
import lombok.experimental.PackagePrivate;

@AllArgsConstructor
@FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE)
public class FieldDefaultsExample {
    public final int a;
    int b;
    @NonFinal int c;
    @PackagePrivate int d;
}

缺省为 private final。如果不想使用缺省值,可显式标注,或使用 NonFinal 取消 final

编译后如下:

public class FieldDefaultsExample {
    public final int a;     // 明确定义的,不受影响
    private final int b;    // 未明确定义的,使用注解的private final
    private int c;          // 指定了NonFinal则只保留private
    final int d;            // 执行了PackagePrivate,表示使用包私有,即default可见修饰符,只保留final

    public FieldDefaultsExample(int a, int b, int c, int d) {
        super();
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
    }
}

3、@Delegate

代理方法。上代码

import lombok.experimental.Delegate;

import java.util.ArrayList;
import java.util.Collection;

public class User {

    private interface SimpleCollection {
        boolean add(String item);
        boolean remove(Object item);
    }

    @Delegate(types = SimpleCollection.class)
    private Collection<String> collection = new ArrayList<>();

    public static void main(String[] args) {
        User user = new User();
        user.add("item1");  // 实际上加到collection中了
        user.add("item2");

        System.out.println(user.collection);    // [item1, item2]
    }
}

编译后如下:

import java.util.ArrayList;
import java.util.Collection;

public class User {
    private Collection<String> collection = new ArrayList();

    public User() {
    }

    public static void main(String[] args) {
        User user = new User();
        user.add("item1");
        user.add("item2");
        System.out.println(user.collection);
    }

    public boolean add(final String item) {
        return this.collection.add(item);
    }

    public boolean remove(final Object item) {
        return this.collection.remove(item);
    }

    private interface SimpleCollection {
        boolean add(String item);
        boolean remove(Object item);
    }
}

此外还有

  • @ExtensionMethod

  • @Wither

  • @UtilityClass

  • @Helper

总结

以上注解可根据需要一起搭配使用!

虽说轮子好,但是我们不仅要知其然,也要知其所以然!

相关文章

未经允许请勿转载:程序喵 » Lombok 介绍及详细使用方法示例

点  赞 (2) 打  赏
分享到: