您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

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

时间:2020-06-17 09:41:01  来源:  作者:

1 简介

Lombok,印尼的一个岛屿,龙目岛。但在JAVA的世界里,它是一个方便的类库,能提供很多便利,因此得到许多人的青睐。但也有不少反对声音。这是为什么呢?

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

 

之前去龙目岛拍的日落。

2 Lombok提供的便利

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

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

举个例子,如果不用Lombok,实现getter/setter、equals、hashCode、toString代码量非常大,如下所示:

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:生成equals和hashCode方法,注意这两个应该同时去实现;

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor:构造方法;

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

@Builder:生成builder方法;

@Log:日志相关:

@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生成代码,别人不安装插件也不会有报错。

另外,多几行代码还能体现工作量,哈哈哈哈哈哈......



Tags:Lombok   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在Java开发中,因工作需要,你可能会学习或被迫去学习Lombok这个工具,这玩意用起来可以说是贼爽,很方便,可玄武老师实际上并不推荐大家使用,至于Lombok是什么?怎么入门?为什么不推荐使...【详细内容】
2020-10-23  Tags: Lombok  点击:(55)  评论:(0)  加入收藏
去年在项目当中引入了Lombok插件,着实解放了双手,代替了一些重复的简单工作(Getter,Setter,toString等方法的编写),但是,在使用的过程当中,也发现了一些坑,开始的时候并没有察觉到...【详细内容】
2020-10-21  Tags: Lombok  点击:(147)  评论:(0)  加入收藏
1 简介Lombok,印尼的一个岛屿,龙目岛。但在Java的世界里,它是一个方便的类库,能提供很多便利,因此得到许多人的青睐。但也有不少反对声音。这是为什么呢? 之前去龙目岛拍的日落。2...【详细内容】
2020-06-17  Tags: Lombok  点击:(63)  评论:(0)  加入收藏
相信大家在项目中都使用过Lombok,因为能够简化我们许多的代码,但是该有的功能一点也不少。那么lombok到底是个什么呢,lombok是一个可以通过简单的注解的形式来帮助我们简化消除...【详细内容】
2020-03-08  Tags: Lombok  点击:(34)  评论:(0)  加入收藏
1 Lombok背景介绍官方介绍如下:Project Lombok makes java a spicier language by adding &#39;handlers&#39; that know how to build and compile simple, boilerplate-fre...【详细内容】
2019-12-06  Tags: Lombok  点击:(66)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(11)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(21)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条