Java代码精简神器Lombok的使用

2018-09-06

Java 代码中有很多冗余、臃肿的代码(如:Getter/Setter、构造方法、hashCode 方法等)lombok 是一款 IDE 插件,其专注于消除此类代码,以达到代码简洁高效的目的。它同时提供了 IDEA 以及 Eclipse 相关的插件,本文以 IDEA 为例,做一些相关的示例

准备工作

1)IDEA 中安装相关的插件,如图:

image

2)IDEA 编译器相关设置,如图:

image

构建项目

以 SpringBoot 项目为例,以下为 pom.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>lombok-example</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>lombok-example</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

常用注解

lombok 提供了很多注解,常用的如下。

注解 作用
Getter 注解在属性上,提供 getter 方法;
Setter 注解在属性上,提供 setter 方法;
AllArgsConstructor 注解在类上,提供构造方法,参数为所有属性;
NoArgsConstructor 注解在类上,提供无参构造方法;
Data 注解在类上,提供所有属性的 getter 方法、setter 方法以及 equals、hashCode、toString 等方法;
Log 注解在类上,提供一个名为 log 的属性,类型为 java.util.logging.Logger,也可使用 @Log4j、@Log4j2、Slf4j 等其他注解;
ToString 注解在类上,提供 toString 方法;
EqualsAndHashCode 注解在类上,提供 equals、hashCode 方法;
Synchronized 注解在方法上,提供 synchronized,可以指定锁的名称;
NonNull 注解在方法参数上,提供对参数的校验,防止空指针异常;
Cleanup 注解在局部变量上,提供对资源的关闭,即调用 close 方法;

使用示例

package com.example.lombok;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;

@Data
@ToString
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer uid;
    private String username;
    private String password;
}

@Slf4j
class UserService {

    public static void main(String[] args) {
        User user = new User().setUid(1).setUsername("username").setPassword("123");
        log.debug("user = {}", user);
    }
}

直接运行看下结果是否正确吧:

21:26:31.742 [main] DEBUG com.example.lombok.UserService - user = User(uid=1, username=username, password=123)

如此一来,代码变得相当的简洁明了。

最终生成的代码结构

lombok 通过插件在编译期间根据注解自动生成了相关的代码,通过下面的代码结构图可以看出一些端倪:

image