本文主要给大家介绍 Lombok 插件,以及如何使用该插件?

Lombok属于编译级别的插件,我们可以在代码中写好注解,然后项目运行的时候便会自动生成部分代码。

可能还是有同学不理解,那么我举个通俗的例子:我们 Class 中的属性是要有 getter settter等代码的,可以通过 IDEA的 Generate 来生成,但是在项目开发的时候, Class 中的属性是一直在变化、会时不时更改的,使用 IDEA的 Generate 是可以生成 getter settter等代码,但是属性一变我们就要对应的修改代码了,非常麻烦。

如果我们使用 Lombok 的注解就不会这么麻烦,Class 中的属性随便你怎么改,我写好了注解,项目编译的时候生成代码,是万万不会受影响的。

如何安装?

我目前使用的是最新版 IDEA ,直接内置了这款插件。 以往老版本的 IDEA 还是需要自己在 Plugins 中安装。

WX20210606-183204@2x.png

引入依赖

插件安装好了,我们需要在项目里添加 Lombok 的编译支持,

Maven

在 pom 文件里面添加 dependency

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

Gradle

首先添加一个 Plugin

plugins {
    id 'io.franzbecker.gradle-lombok' version '1.11'
}

然后再配置 Lombok 的版本:

lombok { // optional: values below are the defaults
    version = "1.18.20"
    sha256 = ""
}

基本用法

Lombok 的核心就在于注解,都有以下这些注解:

  • @Data

    • 注解在类上;提供类所有属性的 get 和 set 方法,此外还提供了equals、canEqual、hashCode、toString 方法。
  • @Setter

    • 注解在 属性上;为单个属性提供 set 方法; 注解在类上,为该类所有的属性提供 set 方法, 都提供默认构造方法。
  • @Getter

    • 注解在属性上;为单个属性提供 get 方法; 注解在类,为该类所有的属性提供 get 方法,都提供默认构造方法。
  • @Log4j

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

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

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

    • 注解在类上, 可以生成 equals、canEqual、hashCode 方法。
  • @NonNull

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

    • 这个注解用在变量前面,可以保证此变量代表的资源会被自动关闭,默认是调用资源的 close() 方法,如果该资源有其它关闭方法,可使用 @Cleanup(“methodName”) 来指定要调用的方法,也会生成默认的构造方法
  • @ToString

    • 这个注解用在类上,可以生成所有参数的 toString 方法,还会生成默认的构造方法。
  • @RequiredArgsConstructor

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

    • 这个注解用在类上,会生成含所有参数的构造方法,get 方法,此外还提供了equals、hashCode、toString 方法。
  • @SneakyThrows

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

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

我给大家详细说明 @Data 注解:

使用这个注解直接会在项目编译的时候,自动生成该类中属性的 getsetequalscanEqualhashCodetoString 方法

我创建了一个学生类,类中只有两个学生属性:nameage ,然后我类名上写上注解 @Data,其他的什么都说没有了。

package src.main.Java;

import lombok.Data;

/**
 * @author BoJackzhang
 */
@Data
public class Student {
    String name = "张三";

    int age = 18;

}

然后,我运行编译项目,在打开编译之后的学生类,多出来的代码都是 Lombok 生成的。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package src.main.Java;

public class Student {
    String name = "张三";
    int age = 18;

    public Student() {
    }

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

    public int getAge() {
        return this.age;
    }

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

    public void setAge(int age) {
        this.age = age;
    }

    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof Student)) {
            return false;
        } else {
            Student other = (Student)o;
            if (!other.canEqual(this)) {
                return false;
            } else if (this.getAge() != other.getAge()) {
                return false;
            } else {
                Object this$name = this.getName();
                Object other$name = other.getName();
                if (this$name == null) {
                    if (other$name != null) {
                        return false;
                    }
                } else if (!this$name.equals(other$name)) {
                    return false;
                }

                return true;
            }
        }
    }

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

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

    public String toString() {
        return "Student(name=" + this.getName() + ", age=" + this.getAge() + ")";
    }
}

如下图所示

截屏2021-06-06 20.28.53.png

至于其他的注解,我就不详细说了,大家用的时候看看文档就行。

通过 Lombok 可以很大程度提高我们开发的效率,我认为这也是在避免重复造轮子,毕竟能生成就不自己写,方便。

想了解更多idea的“骚操作”,请查看:IDEA教程

标签: idea破解, idea激活码, Lombok, IDEA教程, idea注册码, idea注册码失效, idea注册码在线生成, idea破解教程, IDEA注册码免费, IDEA基础教程, IDEA高级教程, IDEA核心教程, IDEA插件, Lombok插件