0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

重演自己如何掉入Lombok的戏法陷阱

Android编程精选 来源:ramostear 作者:树下魅狐 2021-10-28 11:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

https://www.ramostear.com/blog/2020/04/28/uk1860p8.html 如果您正在阅读此文,想必您对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之前,我们的源代码看起来是这一的:

	

publicclassMyObject{ privateLongid; privateStringname; privateintage; privateintgender; publicLonggetId(){ returnid; } publicvoidsetId(Longid){ this.id=id; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } publicintgetGender(){ returngender; } publicvoidsetGender(intgender){ this.gender=gender; } @Override publicbooleanequals(Objecto){ if(this==o){ returntrue; } if(o==null||getClass()!=o.getClass()){ returnfalse; } MyObjectobj=(MyObject)o; returnage=obj.age&& gender=obj.gender&& Objects.equals(id,obj.id)&& Objects.queals(name,obj.name); } @Override publicinthashCode(){ returnObjects.hash(id,name,age,gender); } @Override publicStringtoString(){ return"MyObject{"+ "id="+id+ "name="+name+ "age="+age+ "gender="+gander+ "}"; } }

每个JavaBean都会充斥着如上述getter,setter,equals,hashCode和toString的模板代码,这看起来像一个偏胖的人(不得不承认Java是一个有缺陷的编程语言)。当我们安装好Lombok插件后,IDE便可以识别其酷炫的注解,使用Lombok的@Getter@Setter注解后,代码会像下面这样看起来很苗条:

	

@Getter @Setter publicclassMyObject{ privateLongid; privateStringname; privateintage; privateintgender; @Override publicbooleanequals(Objecto){ if(this==o){ returntrue; } if(o==null||getClass()!=o.getClass()){ returnfalse; } MyObjectobj=(MyObject)o; returnage=obj.age&& gender=obj.gender&& Objects.equals(id,obj.id)&& Objects.queals(name,obj.name); } @Override publicinthashCode(){ returnObjects.hash(id,name,age,gender); } @Override publicStringtoString(){ return"MyObject{"+ "id="+id+ "name="+name+ "age="+age+ "gender="+gander+ "}"; } }

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

	

@Getter @Setter @EqualsAndHashCode publicclassMyObject{ privateLongid; privateStringname; privateintage; privateintgender; @Override publicStringtoString(){ return"MyObject{"+ "id="+id+ "name="+name+ "age="+age+ "gender="+gander+ "}"; } }

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

	

@Getter @Setter @EqualsAndHashCode @ToString publicclassMyObject{ privateLongid; privateStringname; privateintage; privateintgender; }

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

	

@Data publicclassMyObject{ privateLongid; privateStringname; privateintage; privateintgender; }

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    2997

    浏览量

    115659
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73136

原文标题:Lombok!代码简洁神器还是代码“亚健康”元凶?

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    单片机可靠性差的解决办法

    1、软件陷阱是什么? 软件陷阱是一种用于捕获并处理单片机程序“跑飞”现象的技术,当程序执行过程中因干扰而偏离正常轨道时,软件陷阱可及时发现并将程序拉回正常执行路径。 2、软件陷阱
    发表于 11-25 06:10

    玩转VBAT,电源设计常见陷阱99%都能轻松避开!

    电源设计中的VBAT如同一把钥匙,掌握它就能打开成功的大门。本文将教您如何玩转VBAT,从而在电源设计中轻松避开高达99%的常见陷阱,确保您的设计既高效又可靠。 在物联网开发中,稳定的VBAT供电
    的头像 发表于 11-14 15:58 211次阅读
    玩转VBAT,电源设计常见<b class='flag-5'>陷阱</b>99%都能轻松避开!

    揭秘VBAT:电源设计陷阱的全方位规避策略

    VBAT在电源设计中扮演着举足轻重的角色,但其背后的奥秘往往被忽视,导致设计过程中陷阱频现。本文将为您揭秘VBAT的核心知识,并提供全方位的规避策略,助您有效避开电源设计中绝大多数常见陷阱。 在物
    的头像 发表于 11-14 15:48 69次阅读
    揭秘VBAT:电源设计<b class='flag-5'>陷阱</b>的全方位规避策略

    皮线光缆选购指南:避开3大陷阱,选对“光速通道”

    面对市场上琳琅满目的皮线光缆,如何避免“低价陷阱”或“性能过剩”?本文揭秘选购中的关键考量。 陷阱1:混淆光纤类型 G.652D光纤:成本低,但弯曲损耗大,适合长距离传输(如城域网
    的头像 发表于 11-09 17:44 1035次阅读
    皮线光缆选购指南:避开3大<b class='flag-5'>陷阱</b>,选对“光速通道”

    气密性检测仪厂家选择指南:避开踩坑陷阱,找到最适合的合作伙伴

    现实往往更复杂。让我们深入探讨如何在众多选择中找到真正适合的合作伙伴。一、行业真相:不为人知的选择陷阱陷阱一:精度数据的包装艺术几乎每个厂家都会宣称自己的设备精度
    的头像 发表于 08-26 11:56 376次阅读
    气密性检测仪厂家选择指南:避开踩坑<b class='flag-5'>陷阱</b>,找到最适合的合作伙伴

    Force-I QSCV技术在SiC MOSFET界面陷阱测量中的应用

    电容-电压 (C-V) 测量广泛用于半导体材料和器件表征,可提取氧化物电荷、界面陷阱、掺杂分布、平带电压等关键参数。传统基于 SMU 施加电压并测量电流的准静态方法适用于硅 MOS,但在 SiC
    的头像 发表于 08-25 15:06 3952次阅读
    Force-I QSCV技术在SiC MOSFET界面<b class='flag-5'>陷阱</b>测量中的应用

    选购电池箱气密性检测仪,这些陷阱要避开-岳信仪器

    。然而,市场上产品良莠不齐,暗藏诸多陷阱,稍不注意就可能掉入“坑”中。部分不良商家为吸引眼球,夸大产品的检测精度和速度。他们声称自己的电池箱气密性检测仪能达到极高的精
    的头像 发表于 08-16 11:27 443次阅读
    选购电池箱气密性检测仪,这些<b class='flag-5'>陷阱</b>要避开-岳信仪器

    待机功耗测试的“隐秘陷阱”:为什么你的测试结果可能不准确?

    本文导读在家电、LED等行业,待机功耗测试看似简单——选择一台高精度设备即可。但实际上,许多工程师都在无意中踩中测试“陷阱”:插排上的小红灯、接线方式的选择、量程档位的设定...这些细节影响着你
    的头像 发表于 07-22 11:37 515次阅读
    待机功耗测试的“隐秘<b class='flag-5'>陷阱</b>”:为什么你的测试结果可能不准确?

    电商API常见错误排查指南:避免集成陷阱

    ,帮助您高效避免集成陷阱。内容基于真实电商API实践,确保可靠性和实用性。 一、常见错误类型 电商API集成中,错误往往源于认证、数据、限流等环节。以下是高频问题: 认证失败错误 当API请求未通过身份验证时,系统返回错误码如401或
    的头像 发表于 07-11 14:21 1792次阅读
    电商API常见错误排查指南:避免集成<b class='flag-5'>陷阱</b>

    电气控制设备厂家如何避免 BK 控制变压器的 “陷阱

    BK机床控制变压器电气控制设备厂家们在追求发展的同时,正面临着BK机床控制变压器采购的“陷阱”,一不小心就会陷入困境,影响整个企业的运营与发展,这究竟是怎样的情况呢?一些厂家在采购BK控制变压器
    的头像 发表于 07-04 13:45 350次阅读
    电气控制设备厂家如何避免 BK 控制变压器的 “<b class='flag-5'>陷阱</b>

    必看!15个C语言常见陷阱及避坑指南

      C语言虽强大,但隐藏的“坑”也不少!稍不留神就会导致程序崩溃、数据异常。本文整理15个高频陷阱,助你写出更稳健的代码!   陷阱1:运算符优先级混淆  问题:运算符优先级不同可能导致计算顺序错误
    的头像 发表于 03-16 12:10 1377次阅读

    整流桥选型十大陷阱:MDD从电流谐波到散热设计的实战解析

    关键陷阱,并提供系统性解决方案。一、电流有效值误算:RMS值的隐形杀手案例:某10kW充电桩因按平均值选型,整流桥温升达120℃炸裂。陷阱分析:输入电流波形畸变(T
    的头像 发表于 03-10 10:41 872次阅读
    整流桥选型十大<b class='flag-5'>陷阱</b>:MDD从电流谐波到散热设计的实战解析

    MOS管选型十大陷阱:参数误读引发的血泪教训MDD

    在电力电子设计中,MOS管选型失误导致的硬件失效屡见不鲜。某光伏逆变器因忽视Coss参数引发炸管,直接损失50万元。本文以真实案例为鉴,MDD辰达半导体带您解析MOS管选型中的十大参数陷阱,为工程师
    的头像 发表于 03-04 12:01 1223次阅读
    MOS管选型十大<b class='flag-5'>陷阱</b>:参数误读引发的血泪教训MDD

    AN-348: 避开无源元件的陷阱

    电子发烧友网站提供《AN-348: 避开无源元件的陷阱.pdf》资料免费下载
    发表于 01-13 15:14 0次下载
    AN-348: 避开无源元件的<b class='flag-5'>陷阱</b>

    自己电脑搭建云主机,自己电脑如何搭建云主机?

      如今,服务器远程连接技术正逐渐成为行业的新宠,它代表着服务器管理领域向高效化、智能化迈进的发展趋势。本文将带你剖析自己电脑如何搭建云主机。 自己电脑搭建云主机是一种经济实惠且具有可行性的选择
    的头像 发表于 01-06 09:55 1443次阅读
    <b class='flag-5'>自己</b>电脑搭建云主机,<b class='flag-5'>自己</b>电脑如何搭建云主机?