为什么有些公司不让用 Lombok ?装逼?

为什么有些公司不让用 Lombok ?装逼?

关注我们,设为星标,每天7:30不见不散,架构路上与您共享


回复”架构师“获取资源


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

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

爱的开始,恨的起源

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

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



   

  1. public class MyObject{

  2.    private Long id;

  3.    private String name;

  4.    private int age;

  5.    private int gender;

  6.    public Long getId(){

  7.        return id;

  8.    }

  9.    public void setId(Long id){

  10.        this.id = id;

  11.    }

  12.    public String getName(){

  13.        return name;

  14.    }

  15.    public void setName(String name){

  16.        this.name = name;

  17.    }

  18.    public int getAge(){

  19.        return age;

  20.    }

  21.    public void setAge(int age){

  22.        this.age = age;

  23.    }

  24.    public int getGender(){

  25.        return gender;

  26.    }

  27.    public void setGender(int gender){

  28.        this.gender = gender;

  29.    }

  30.    @Override

  31.    public boolean equals(Object o){

  32.        if(this == o){

  33.            return true;

  34.        }

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

  36.            return false;

  37.        }

  38.        MyObject obj = (MyObject) o;

  39.        return age = obj.age &&

  40.            gender = obj.gender &&

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

  42.            Objects.queals(name,obj.name);

  43.    }

  44.    @Override

  45.    public int hashCode(){

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

  47.    }

  48.    @Override

  49.    public String toString(){

  50.        return "MyObject{"+

  51.            "id="+id+

  52.            "name="+name+

  53.            "age="+age+

  54.            "gender="+gander+

  55.            "}";

  56.    }

  57. }

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

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

   
  1. @Getter

  2. @Setter

  3. public class MyObject{

  4.    private Long id;

  5.    private String name;

  6.    private int age;

  7.    private int gender;

  8.    @Override

  9.    public boolean equals(Object o){

  10.        if(this == o){

  11.            return true;

  12.        }

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

  14.            return false;

  15.        }

  16.        MyObject obj = (MyObject) o;

  17.        return age = obj.age &&

  18.            gender = obj.gender &&

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

  20.            Objects.queals(name,obj.name);

  21.    }

  22.    @Override

  23.    public int hashCode(){

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

  25.    }

  26.    @Override

  27.    public String toString(){

  28.        return "MyObject{"+

  29.            "id="+id+

  30.            "name="+name+

  31.            "age="+age+

  32.            "gender="+gander+

  33.            "}";

  34.    }

  35. }

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

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

   
  1. @Getter

  2. @Setter

  3. @EqualsAndHashCode

  4. public class MyObject{

  5.    private Long id;

  6.    private String name;

  7.    private int age;

  8.    private int gender;

  9.    @Override

  10.    public String toString(){

  11.        return "MyObject{"+

  12.            "id="+id+

  13.            "name="+name+

  14.            "age="+age+

  15.            "gender="+gander+

  16.            "}";

  17.    }

  18. }

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

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

   
  1. @Data

  2. public class MyObject{

  3.    private Long id;

  4.    private String name;

  5.    private int age;

  6.    private int gender;

  7. }

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

文章来源:
https:/
/ramostear.com/blog/2020/04/28/uk1860p8.html

为什么有些公司不让用 Lombok ?装逼?

到此文章就结束了。如果今天的文章对你在进阶架构师的路上有新的启发和进步,欢迎转发给更多人。欢迎加入架构师社区技术交流群,众多大咖带你进阶架构师,在后台回复“加群”即可入群。








为什么有些公司不让用 Lombok ?装逼?

第一期打卡送书5本+1个腾讯视频VIP月卡(11月1日-12月1日)



这些年小编给你分享过的干货

《IDEA 2020.2 最新破解教程,有效期到2089年

Kubernetes的前世今生

你们公司的架构师是什么样的?

《Docker与CI持续集成/CD持续部署》

《还有40天,Java 11就要横空出世了》

《JDK 10 的 109 项新特性》

《学习微服务的十大理由》

《进大厂必须掌握的50个微服务面试问题》


为什么有些公司不让用 Lombok ?装逼?

为什么有些公司不让用 Lombok ?装逼?

转发在看就是最大的支持❤️

本文分享自微信公众号 – Java架构师社区(mush_java_jg)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2459.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • MySQL数据库中varchar与char类型的区别

    MySQL数据库中varchar与char类型的区别

  • mini usb接口图片_linux查看接口速率

    mini usb接口图片_linux查看接口速率华硕X450V笔记本更换intelAX200无线网卡@TOC下面内容以更换AX200为主要内容,还涉及无线网卡接口(minipcie和m.2/ngff),网线,路由器,无线网卡天线,AX200驱动(包括刷Killer驱动的问题,不建议刷!!!,没什么卵用)等与网卡性能相关的内容。目前使用情况是:有5G爽,信号强,连接速度高,稳定不掉线,网速快,有蓝牙爽歪歪。笔记本是2013年买的,老款了。换了三星860EVO500G,光驱改放机械,内存加了4G,成8G双通道,电池换了一次,又要换了。现在5Gw

  • Hadoop入门——初识Hadoop

    Hadoop入门——初识Hadoop推荐一个微信商城,扫码即可购买,性价比超高,程序员必备店主就是博主,有任何问题可随时通过商城内的微信与博主取得联系一.hadoop是什么Hadoop被公认是一套行业大数据标准开源软件,在分布式环境下提供了海量数据的处理能力。几乎所有主流厂商都围绕Hadoop开发工具、开源软件、商业化工具和技术服务。今年大型IT公司,如EMC、Microsoft、Intel、Teradata、…

  • 网易邮箱问候语

    网易邮箱问候语

    2021年11月17日
  • word文档怎么打印成册子_零基础学word文档

    word文档怎么打印成册子_零基础学word文档Word2003是微软公司提供的一款文字处理软件,可以对文字进行排版和编辑、分段等各种处理,最终将编辑好的内容打印出来,是办公室一族中必备的办公软件之一。Word2003具有一个“书籍折页”的功能,能够在一页纸上打印两页的内容,打印后可以从中缝装订成折叠的小册子,更便于携带和阅读,具体怎么来设置呢?就让Word联盟为大家带来分享!动画演示:①打开“页面设置”对话框,切换到

  • python的安装包安装教程_如何安装python

    python的安装包安装教程_如何安装pythonpip是Python包管理工具,该工具提供了对Python包的查找、下载、安装、卸载的功能。一般情况pip对应的是Python2.7,pip3对应的是Python3.x。部分Linux发行版可直接用包管理器安装pip,如Debian和Ubuntu:sudoapt-getinstallpython-pip安装包pipinstallSomePackage…

    2022年10月30日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号