来源:toutiao.com/i6820517160964588044


如果您正在阅读此文,想必您对Project Lombok已经有了一段时间的了解。您是否正准备拥抱Lombok?还是正准备将如此酷炫的项目推荐给你的团队?如果您准备那么做,不妨听听我在使用Lombok一年后的一些感受。

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

一年以前,我和大多数人都认为Lombok的出现会让Java的编码体验会更好,并极力的在我的团队中推荐使用Lombok。一年以后,我开始对此产生顾虑,尤其是在我准备为开源的博客系统Una-Boot升级Java版本时,我才意识到Lombok自己掉入了一个戏法陷阱。在我进一步分析其源代码并理解相关注解的工作原理后,发现我并不需要使用一个非标准的第三方库将Java转换为一个精巧而酷炫的语言。引入Lombok让我的项目一时爽,但一时爽的代价是随着项目推进,技术债务开始累积。

接下来,我将用几个大家耳熟能详的场景,重演自己是如何掉入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@Setterpublic 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+            "}";    }}

你以为Lombok就这点能耐?它还能让你代码的“身材”更苗条,更魔鬼。上面的代码仍然还有改进的空间,我们可以用@EqualsAndHashCode注解替换到equals和hashCode方法:

@Getter@Setter@EqualsAndHashCodepublic 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+            "}";    }}

现在的代码是否看起来爽多了?但这还不是最爽的时候。既然其他方法都替换掉了,那把toString方法也一起拿掉吧.如你所愿,可以使用@ToString注解去掉对于的方法:

@Getter@Setter@EqualsAndHashCode@ToStringpublic class MyObject{    private Long id;    private String name;    private int age;    private int gender;}

经过Lombok的戏法之后,相比一开始的代码,看起来是不是很酷炫,很苗条,很性感?你以为到此为止了?远不止于此。你会发现类名上一大坨注解看起来好别扭,Lombok提供了一个组合注解@Data,可以替换掉类名头上那坨像翔一样的东西:

@Datapublic 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,请与你的团队多沟通和三思。

以下资料关注公众号,回复【8888】,即可免费获取。

福利时刻


lombok依赖_为什么有些公司不让用 Lombok ?不要问,自己看吧相关推荐

  1. lombok依赖_使用Lombok 前你需要知道这些

    转自:树下魅狐 链接:https://ramostear.com/blog/2020/04/28/uk1860p8.html 不得不承认,Lombok 是一个很不错的 Java 库,它可以让你在少写代 ...

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

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

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

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

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

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

  5. eclipse lombok插件安装_你干啥的?Lombok

    01.Lombok 的自我介绍 Lombok 在官网是这样作自我介绍的: Project Lombok makes java a spicier language by adding 'handler ...

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

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

  7. 为什么有些公司不让用 Lombok ?

    点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看&quo ...

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

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

  9. Springboot-‘@Getter‘ not applicable to type,报错是因为没有引用lombok依赖

    截图: 报错原因: 默认引用进来的包是"import jdk.nashorn.internal.objects.annotations.Getter;" 然后去看一下这个注解,发现 ...

最新文章

  1. linux启动spark命令,在linux上安装spark
  2. 干货 | 万字长文全面解析GraphQL,携程微服务背景下的前后端数据交互方案
  3. 切换数据库_硬核数据库postgres使用pgpool完成主备自动切换,快来盘它
  4. linux / pkg-config 原理及用法
  5. Tomcat服务器java.lang.IllegalArgumentException异常
  6. TeamViewer13 -- 安装、使用说明
  7. 循序渐进 OSPF的详细剖析(四)
  8. OpenEuler系统是什么
  9. SqlServer标识列
  10. 计算机系统注册表文件格式,WIN7系统中,如何在注册表中修改系统时间格式?...
  11. 全国大学生数学建模比赛介绍及其入门(国赛+美赛)
  12. 天气预报查询数据接口、实时天气、未来24小时、7天/15天预报
  13. TCP/IP协议详解:IP、ARP、RARP、ICMP、IGMP
  14. Stata:实时估计个股贝塔(beta)系数
  15. postfix反垃圾邮件说明
  16. SofaRpc源码学习篇-netty以及跟dubbo骚操作,负载均衡
  17. has leaked IntentReceiver ...that was originally registerd here.Are you missing a call to unregister
  18. 什么?人类一败涂地手游竟然上线了?教你最快的安装方法
  19. 用matlab解决多重共线性问题,多重共线性和非线性回归的问题
  20. 算法设计-利用栈判别表达式中的括弧是否配对

热门文章

  1. c语言里 如何取得线程的lpparameter'参数,请问线程函数如何访问对话框类中的变量...
  2. flask ajax 笔记
  3. C语言实现ICMP协议Ping命令
  4. 程序中调用命令行命令,不显示那个黑黑的DOS窗口
  5. ubuntu tree 显示中文的方法
  6. VC++ 读取和保存文件对话框及默认目录
  7. c/c++面试试题(一)
  8. 前端学习(3277):promise的使用
  9. [html] 常见的浏览器内核都有哪些?并介绍下你对内核的理解
  10. [vue] 怎么修改vue打包后生成文件路径?