Lombok,告别setter/getter

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

前言

我们这里先写下一段常见代码。:

public class Person {
    private String name;
    private int age;
    private String sex;
    private String birthday;

    public String getName() {
        return name;
    }

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


   // 省略多个setter、getter
复制代码

这个就是我们最常见的代码,每个private修饰的成员变量都有一个setter和getter方法,但是缺点也显而易见,就是setter/getter方法随着字段的增加而增加,会使得实体类显得代码臃肿,视觉上也不美观。

所以,今天要讲的Lombok就是可以自动帮你生成setter和getter的神器!经过一些注解的修饰,上面代码就可以变成下面酱紫!

@Setter
@Getter
public class Person {
    private String name;
    private int age;
    private String sex;
    private String birthday;
}
复制代码

就是这么清爽,就是这么简洁!那么可能就要开始杠了,为什么不能用public修饰,这样setter和getter就直接可以不用写了,还用什么神器?但是规范就是规范,为了变量的访问权限控制在自己手中,所以必须用private修饰。
接下来就是安利Lombok使用和其他功能。

IDEA安装插件

在settings的Plugins,搜索Lombok并安装,重启IDEA即可生效。

插件安装

引入依赖

如果你是用的maven项目,只需要引入它的pom即可:

<dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.12</version>
</dependency>
复制代码

如果不使用maven就直接导入lombok-1.18.12.jar即可。

使用大全

写段代码,包含常用且易懂的Lombok注解

@Setter
@Getter
@Slf4j
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private String name;
    private int age;
    private String sex;
    private String birthday;

    public void sing(@NonNull String songName) {
    	// @Slf4j生成的logger
        log.info(songName);
        System.out.println(songName);
    }

    public void read(String bookPath) throws FileNotFoundException {
        @Cleanup
        FileInputStream in = new FileInputStream(bookPath);
    }
}
复制代码
@Setter和@Getter

这两个注解用在类上就是为所有的private成员变量添加getter和setter方法,如果放在成员变量上,就是为单个成员变量添加setter和getter方法

@Slf4j

我们平时使用slf4j打印日志的时候,需要获取logger,
代码如下:

Logger logger = LoggerFactory.getLogger(Person.class);
logger.info("Hello World!")
复制代码

使用@Slf4j注解之后,lombok帮你创建了一个名为log的logger,可直接使用。

@ToString

这个不推荐使用,虽然可以帮你生成toString方法,但是往往不符合我们的要求。他输出的结果是这样的。

Person(name=null, age=0, sex=null, birthday=null)
复制代码
@AllArgsConstructor

帮你生成一个包含所有字段的构造器

@NoArgsConstructor

帮你生成一个无参类构造器,即new Person(){}

@NotNull

顾名思义,就是他修饰的变量和参数不能为null。测试一下

public static void main(String[] args) {
        new Person().sing(null);
    }
// 报错:Exception in thread "main" java.lang.NullPointerException: songName is marked non-null but is null
复制代码
@Cleanup

我们在读取文件的时候创建流,在使用完后总会调用close()来关闭这个流。

在获取数据库的connection的时候,用完也会调用close()来关闭连接。

@Cleanup修饰在创建流和获取Connection的时候,在使用完成后会自动帮你关闭,你就不用调用close()自行关闭

@Data

这个没写在样例代码中,是因为这个是一个作用在类上,并且是@Setter、@Getter、@Slf4j的集合体。但是不推荐使用。

包含的注解如下图:
在这里插入图片描述

结语

Lombok简化了代码,但是也会在代码阅读上带来了一些障碍,利弊之间,自行权衡。任何事都有两面,有的人喜欢它,也有厌恶它。从我的角度来说,至少它让我的代码变得更简洁。据说Java14到时候也会提供Lombok的这些功能,拭目以待吧!