让人又爱又恨的Lombok,到底该不该用

1 简介

Lombok,印尼的一个岛屿,龙目岛。但在Java的天下里,它是一个利便的类库,能提供许多便利,因此获得许多人的青睐。但也有不少否决声音。这是为什么呢?

让人又爱又恨的Lombok,到底该不该用

之前往龙目岛拍的日落。

2 Lombok提供的便利

一样平常我们在Java中用到POJO时,就很容易想到要用Lombok,如VODTODO等。使用Lombok需要安装对应IDE的插件,同时需要引入依赖:

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

举个例子,若是不用Lombok,实现getter/setterequalshashCodetoString代码量异常大,如下所示:

package com.pkslow.basic.lombok;

import java.util.Objects;

public class Book {
    private String name;
    private int id;
    private double price;
    private String author;
    private String desc;

    public String getName() {
        return name;
    }

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Book book = (Book) o;
        return id == book.id &&
                Double.compare(book.price, price) == 0 &&
                Objects.equals(name, book.name) &&
                Objects.equals(author, book.author) &&
                Objects.equals(desc, book.desc);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, id, price, author, desc);
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", price=" + price +
                ", author='" + author + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

而且大部分是样板代码,没有太多现实逻辑。

若是使用Lombok则异常简朴,一个注解@Data就可以完成以上事情(安装了Lombok插件后才气显示右边的方式):

让人又爱又恨的Lombok,到底该不该用

Lombok的常用注解有:

@NonNull:用于做空指针异常检测;

@Cleanup:自动资源关闭;

@Getter/@Setter:自动天生get/set方式;

@ToString:天生toString方式,利便打印调试;

@EqualsAndHashCode:天生equalshashCode方式,注重这两个应该同时去实现;

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor:组织方式;

@Data:相当于 @ToString+ @EqualsAndHashCode+@Getter+ @Setter +@RequiredArgsConstructor

@Builder:天生builder方式;

@Log:日志相关:

深度解密 Go 语言之 sync.map

@CommonsLog:org.apache.commons.logging.LogFactory.getLog(LogExample.class);
@Flogger:com.google.common.flogger.FluentLogger.forEnclosingClass();
@JBossLog:org.jboss.logging.Logger.getLogger(LogExample.class);
@Log:java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4j:org.apache.log4j.Logger.getLogger(LogExample.class);
@Log4j2:org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
@Slf4j:org.slf4j.LoggerFactory.getLogger(LogExample.class);
@XSlf4j:org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
@CustomLog:com.foo.your.LoggerFactory.createYourLogger(LogExample.class);

以是Lombok确实能给我们带来极大的便利,削减大量重复、无营业逻辑的代码,代码显得对照清洁;修改了field的名字,不用多处修改;提高开发效率。

3 Lombok所带来的问题

固然,也有人提出了差别意见:

调试时没有详细代码,不利便Debug;

需要强制别人安装第三方插件,否则会显示报错;

在检查测试笼罩率的时刻,无法直观显示哪些代码已笼罩和未笼罩;

无法按自己意愿实现,好比toString方式,有时需要输出不一样的String花样,并不一定是按Lombok的实现;

对于一些常用的方式,IDE已经可以自动天生,不需要Lombok一样可以高效开发。

让人又爱又恨的Lombok,到底该不该用

IDEA没有提供Builder,但可以通过安装插件方式使用。

让人又爱又恨的Lombok,到底该不该用

乐成安装后,就能天生Builder代码了:

让人又爱又恨的Lombok,到底该不该用

4 总结

一开始我是支持使用Lombok的,经由一段时间使用及泛起了一些问题后,我照样以为通过IDE自动天生代码的方式更适合。究竟强制要求别人安装插件这种实在是太野蛮了,而通过IDEA天生代码,别人不安装插件也不会有报错。

另外,多几行代码还能体现事情量,哈哈哈哈哈哈……

迎接接见南瓜慢说 www.pkslow.com获取更多精彩文章!

迎接关注微信民众号<南瓜慢说>,将连续为你更新…

让人又爱又恨的Lombok,到底该不该用

多读书,多分享;多写作,多整理。

原创文章,作者:2d28新闻网,如若转载,请注明出处:https://www.2d28.com/archives/16664.html