转自:树下魅狐

链接:https://ramostear.com/blog/2020/04/28/uk1860p8.html

不得不承认,Lombok 是一个很不错的 Java 库,它可以让你在少写代码的同时耍耍酷,简单的几个注解,就可以干掉一大片模板代码。但是,所有的源代码很多时候是用来阅读的,只有很少的时间是用来执行的 (你可以细品这句话)。

接下来,我将用几个大家耳熟能详的场景,重演我们是如何掉入 Lombok 的戏法陷阱。

爱的开始,恨的起源

面对 Lombok 提供的诸多 “神走位”,你并不会介意在 IDE 上新增一个插件。对于 IntelliJ IDEA 玩家而言,只需搜索 “Lombok Plugin” 便可找到这款神器并安装上它。爱上 Lombok 从安装 Lombok 插件开始,恨也从此萌芽。

没使用 Lombok 之前,我们的源代码看起来是这一的:

public class MyObject{

   private Long id;

   private String name;

   private int age;

   private int gender;

   public Long getId(){

       return id;

   }

   public void setId(Long id){

       this.id = id;

   }

   public String getName(){

       return name;

   }

   public void setName(String name){

       this.name = name;

   }

   public int getAge(){

       return age;

   }

   public void setAge(int age){

       this.age = age;

   }

   public int getGender(){

       return gender;

   }

   public void setGender(int gender){

       this.gender = gender;

   }

   @Override

   public boolean equals(Object o){

       if(this == o){

           return true;

       }

       if(o == null || getClass() != o.getClass()){

           return false;

       }

       MyObject obj = (MyObject) o;

       return age = obj.age &&

           gender = obj.gender &&

           Objects.equals(id,obj.id) &&

           Objects.queals(name,obj.name);

   }

   @Override

   public int hashCode(){

       return Objects.hash(id,name,age,gender);

   }

   @Override

   public String toString(){

       return "MyObject{"+

           "id="+id+

           "name="+name+

           "age="+age+

           "gender="+gander+

           "}";

   }

}

每个 JavaBean 都会充斥着如上述 getter,setter,equals,hashCode 和 toString 的模板代码,这看起来像一个偏胖的人(不得不承认 Java 是一个有缺陷的编程语言)。

当我们安装好 Lombok 插件后,IDE 便可以识别其酷炫的注解,使用 Lombok 的 @Getter 和 @Setter 注解后,代码会像下面这样看起来很苗条:

@Getter

@Setter

public class MyObject{

   private Long id;

   private String name;

   private int age;

   private int gender;

   @Override

   public boolean equals(Object o){

       if(this == o){

           return true;

       }

       if(o == null || getClass() != o.getClass()){

           return false;

       }

       MyObject obj = (MyObject) o;

       return age = obj.age &&

           gender = obj.gender &&

           Objects.equals(id,obj.id) &&

           Objects.queals(name,obj.name);

   }

   @Override

   public int hashCode(){

       return Objects.hash(id,name,age,gender);

   }

   @Override

   public String toString(){

       return "MyObject{"+

           "id="+id+

           "name="+name+

           "age="+age+

           "gender="+gander+

           "}";

   }

}

现在的代码是否看起来爽多了?但这还不是最爽的时候。

既然其他方法都替换掉了,那把 toString 方法也一起拿掉吧。如你所愿,可以使用 @ToString 注解去掉对于的方法:

@Getter

@Setter

@EqualsAndHashCode

public class MyObject{

   private Long id;

   private String name;

   private int age;

   private int gender;

   @Override

   public String toString(){

       return "MyObject{"+

           "id="+id+

           "name="+name+

           "age="+age+

           "gender="+gander+

           "}";

   }

}

经过 Lombok 的戏法之后,相比一开始的代码,看起来是不是很酷炫,很苗条,很性感?你以为到此为止了?

远不止于此。你会发现类名上一大坨注解看起来好别扭,Lombok 提供了一个组合注解 @Data,可以替换掉类名头上那坨像翔一样的东西:

@Data

public class MyObject{

   private Long id;

   private String name;

   private int age;

   private int gender;

}

现在,Lombok 是否让你的对象成为了你心目中完美的样子?魔鬼的 “身材”,酷炫精炼。Lombok 还有其他一些注解,如 @Slf4j,@NoArgsConstructor,@AllArgsConstructor 等等,介绍 Lombok 用法不是本文重点。

以上代码行数的变化过程,也许是无数程序员爱上 Lombok 的主要原因吧,这就像一个肥胖的人逐渐变成一个身材苗条的人。

同时也让你看到了一个现象:你以为程序员很懒吗?其他有些时候他们比你想象中的还要懒。在爽的同时,也为代码种下了祸根。

扭曲的审美,爱的隐患

扭曲的审美,导致了被审视的对象处于亚健康状态。使用 Lombok 插件之后,我们的代码也处于 “亚健康” 状态。还是回归一开始的那句话:所有的源代码很多时候是用来阅读的,只有很少的时间是用来执行的。

本质上讲,我们都追求减少程序中的样板代码以使其代码更精炼简洁,从而提高代码的可读性和可维护性。

但 Lombok 并没有达到我们所追求的这一愿景,它仅仅是利用 Java 语言在编译时的空档期,使用一种很取巧的方式,将我们所需要的方法注入(写入)到当前的类中,这种过程很像在 hack 我们的代码,只是一种看起来酷炫的把戏。

这种把戏并不智能和安全,反而会破坏 Java 代码现有的特性以及代码的可读性。

下面,结合我自己使用 Lombok 之后的感受,谈谈 Lombok 带来的几大痛点。

1、JDK 版本问题

当我想要将现有项目的 JDK 从 Java 8 升级到 Java 11 时,我发现 Lombok 不能正常工作了。

于是我不得不将所有的 Lombok 注解从项目源代码中清除,并使用 IDE 自带的功能生成 getter/setter,equals,hashCode,toString 以及构造器等方法,你也可以使用 Delombok 工具完成这一过程。但这终究会消耗你很多的时间。

2、胁迫使用

当你的源代码中使用了 Lombok,恰好你的代码又被其他的人所使用,那么依赖你代码的人,也必须安装 Lombok 插件 (不管他们喜不喜欢),同时还要花费时间去了解 Lombok 注解的使用情况,如果不那么做,代码将无法正常运行。使用过 Lombok 之后,我发现这是一种很流氓的行为。

3、可读性差

Lombok 隐藏了 JavaBean 封装的细节,如果你使用 @AllArgsConstructor 注解,它将提供一个巨型构造器,让外界有机会在初始化对象时修改类中所有的属性。

首先,这是极其不安全的,因为类中某个属性我们是不希望被修改的;另外,如果某个类中有几十个属性存在,就会有一个包含几十个参数的构造器被 Lombok 注入到类中,这是不理智的行为;

其次,构造器参数的顺序完全由 Lombok 所控制,我们并不能操控,只有当你需要调试时才发现有一个奇怪的 “小强” 在等着你;

最后,在运行代码之前,所有 JavaBean 中的方法你只能想象他们长什么样子,你并不能看见。

4、代码耦合度增加

当你使用 Lombok 来编写某一个模块的代码后,其余依赖此模块的其他代码都需要引入 Lombok 依赖,同时还需要在 IDE 中安装 Lombok 的插件。

虽然 Lombok 的依赖包并不大,但就因为其中一个地方使用了 Lombok,其余所有的依赖方都要强制加入 Lombok 的 Jar 包,这是一种入侵式的耦合,如果再遇上 JDK 版本问题,这将是一场灾难。

5、得不偿失

使用 Lombok,一时觉得很爽,但它却污染了你的代码,破坏了 Java 代码的完整性,可读性和安全性,同时还增加的团队的技术债务,这是一种弊大于利,得不偿失的操作。如果你确实想让自己的代码更加精炼,同时又兼顾可读性和编码效率,不妨使用主流的 Scala 或 Kotlin 这一基于 JVM 的语言。

总 结

Lombok 本身是一个优秀的 Java 代码库,它采用了一种取巧的语法糖,简化了 Java 的编码,为 Java 代码的精简提供了一种方式,但在使用此代码库时,需要了解到 Lombok 并非一个标准的 Java 库。

使用 Lombok,会增加团队的技术债务,降低代码的可读性,增大代码的耦合度和调式难度。

虽然在一定程度上 Lombok 减少了样板代码的书写,但也带来了一些未知的风险。

如果你正在参与一个团队项目(或大型项目), 考虑到后续的升级与扩展,是否使用 Lombok,请与你的团队多沟通和三思。

推荐阅读  点击标题可跳转

1、【译】用Java创建你的第一个区块链-part1

2、【译】用Java创建你的第一个区块链-part2:可交易

3、 使用Spring Boot 2.X构建RESTful服务

4、【译】数据结构中关于树的一切(java版)

5、【译】java多线程(一)

看完本文有收获?请转发分享给更多人

关注「java干货」加星标,提升java技能

❤️给个「在看」,是最大的支持❤️

lombok依赖_使用Lombok 前你需要知道这些相关推荐

  1. lombok依赖_公司来了个新同事不会用 Lombok,还说我代码有问题

    新来的同事不会用 Lombok,所以会引发本文! 背景 最近公司新来一个搞 Java 的同事,搞了半天项目还没有跑起来,后来叫我过去帮他看一下,然后指着红色的编译错误和我说是不是代码有问题.. 我顿时 ...

  2. lombok依赖_为什么有些公司不让用 Lombok ?不要问,自己看吧

    来源:toutiao.com/i6820517160964588044 如果您正在阅读此文,想必您对Project Lombok已经有了一段时间的了解.您是否正准备拥抱Lombok?还是正准备将如此酷 ...

  3. java lombok 插件_关于java:ieda中的Lombok插件安装及测试

    Lombok我的项目是一个Java库,它会主动插入您的编辑器和构建工具中,省略简化咱们程序的编写.例如使用Lombok注解援用,省略pojo包下的实体类里的set.get.tostring等办法的编写 ...

  4. lombok标签_微服务之:springboot入门、Swagger、Lombok使用

    0x01.第一个Springboot程序 项目启动注解:@springbootApplication @SpringBootApplication public class HellobootAppl ...

  5. lombok原理_听说学会用 Lombok 就可以让你早点下班?(你还不看)

    听说隔壁用 Lombok 的六点就下班了,我也想六点下班! 好的,那么这篇文章就介绍下什么是 Lombok,Lombok 做了什么以及 Lombok 是怎么做的? 在介绍之前,先通过是否使用 Lomb ...

  6. lombok原理_十分钟搞懂Lombok使用与原理

    1 简介 Lombok是一款好用顺手的工具,就像Google Guava一样,在此予以强烈推荐,每一个Java工程师都应该使用它.Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的 ...

  7. import lombok 报错_使用lombok

    Lombok是一种JavaArchive(JAR)文件,可用来消除Java代码的冗长.通过在开发环境中实现Lombok,开发人 员可以节省构建诸如hashCode()和equals()这样的方法以及以 ...

  8. IDEA中,maven项目下,lombok插件 ,添加lombok.jar, Maven项目下lombok依赖配置

    IDEA中,maven项目下,lombok插件 ,添加lombok.jar, Maven项目下lombok依赖配置 Maven 项目的创建 在IDEA 21版中,Maven项目无需下载 其他版本,查看 ...

  9. 黑*头条_第4章_文章搜索前后端成形记 实名认证审核

    黑*头条_第4章_文章搜索前后端成形记 & 实名认证审核 文章目录 黑*头条_第4章_文章搜索前后端成形记 & 实名认证审核 文章搜索前后端成形记 & admin实名认证审核 ...

最新文章

  1. 【原】Java学习笔记028 - 集合
  2. 安装node-sass运行报错 Module build failed: TypeError: this.getResolve is not a function at Object.loader
  3. C++实现二叉搜索树的查找(附完整源码)
  4. java安全编码指南之:异常处理
  5. html无损转换pdf,Pdf2html :高保真PDF至HTML转换
  6. spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient 1
  7. S5PV210启动过程
  8. Java 环形缓冲器(Ring Buffer)
  9. oracle存储过程导出查询结果,ORACLE如何实现函数、包、存储过程的导入和导出
  10. python课程-Python课程学习总结
  11. 20155213免考项目——简易的HIDAttack
  12. JQuery获得绝对,相对位置的坐标方法
  13. Ubuntu18.04安装可视化软件Pyviz
  14. 15年的MacBookPro如何升级系统到10.15
  15. BUUCTF--[HarekazeCTF2019]Sqlite Voting
  16. Unity5混音器DSP插件编写教程【一】
  17. 录制PPT课件哪个录屏软件好?这3款值得收藏
  18. 3个月学习成功上岗软件测试,我一个文科女也能吃IT饭了
  19. 非北京户口,户口地买房提取公积金
  20. Qt串口等接口数据协议传输时的字节拼接处理

热门文章

  1. 使用JDBC进行简单连接
  2. python 结尾回车_理解不了Python正则表达式?我帮你搞定
  3. python列表切片赋值_Python中对切片赋值原理分析
  4. python数学公式pdf文件的转换_python转换文件 多种文件转换为pdf
  5. android 大视图风格通知栏,Android中使用Notification实现宽视图通知栏(Notification示例二)...
  6. 金昌搜索引擎优化网络推广_网络推广优化企业服务
  7. LaTeX的表格标题位置
  8. 链表的一些leetcode题目+python(c++)
  9. 齐次坐标,怎么你也叫Homogeneous
  10. Lambda 表达式详解~Streams API~Stream常见接口方法