Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >为什么要放弃 Lombok ?

为什么要放弃 Lombok ?

作者头像
xcbeyond
修改于 2020-06-18 16:48:17
修改于 2020-06-18 16:48:17
1K00
代码可运行
举报
文章被收录于专栏:技术那些事技术那些事
运行总次数:0
代码可运行

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

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

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

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

更多关于 Java 的文章,我整理成了 PDF ,关注微信公众号 Java后端 回复 666 下载。

爱的开始,恨的起源

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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注解后,代码会像下面这样看起来很苗条:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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注解去掉对于的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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,可以替换掉类名头上那坨像翔一样的东西:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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,请与你的团队多沟通和三思。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿技术大咖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java开发神器Lombok的安装与使用
项目中经常使用bean,entity等类,绝大部分数据类类中都需要get、set、toString、equals和hashCode方法,虽然eclipse和idea开发环境下都有自动生成的快捷方式,但自动生成这些代码后,如果bean中的属性一旦有修改、删除或增加时,需要重新生成或删除get/set等方法,给代码维护增加负担。而使用了lombok则不一样,使用了lombok的注解(@Setter,@Getter,@ToString,@@RequiredArgsConstructor,@EqualsAndHashCode或@Data)之后,就不需要编写或生成get/set等方法,很大程度上减少了代码量,而且减少了代码维护的负担。故强烈建议项目中使用lombok,去掉bean中get、set、toString、equals和hashCode等方法的代码。
秃头哥编程
2019/06/17
5770
Java开发神器Lombok的安装与使用
Lombok介绍、使用方法和总结
1 Lombok背景介绍 官方介绍如下: Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code. 大致意思是Lombok通过增加一些“处理程序”,可以让java变得简洁、快速。 2 Lombok使用方法 Lombok能以简单的注解形式来简化java代码,提高开发人员的开发
猿人谷
2018/03/28
1.5K0
Lombok介绍、使用方法和总结
Lombok有啥牛皮的?SpringBoot和IDEA官方都要支持它!
Spring Boot 早在 2.1.x 版本后就在 starter 中内置了 Lombok 依赖,Intellij IDEA 也早在 IDEA 2020.3 版本的时候内置了 Lombok 插件。为什么它们都要支持 Lombok 呢?Lombok 到底有啥牛皮的?今天我们就来补上这一课。
沉默王二
2022/04/14
5430
Lombok有啥牛皮的?SpringBoot和IDEA官方都要支持它!
SpringBoot 实战 | 使用 LomBok
LomBok 是一个插件,它能通过注解帮我们消除那些必须要写但是重复的代码,比如setter,getter,构造函数之类的方法。
JavaFish
2019/10/17
7270
今天 1024,为了不 996,Lombok 用起来以及避坑指南
Lombok 项目是一个 Java 库,它会自动插入编辑器和构建工具中,Lombok 提供了一组有用的注解,用来消除 Java 类中的大量样板代码。
双鬼带单
2020/10/29
7840
lombok系列2:lombok注解详解
看到第一篇《初识lombok》你可能意犹未尽,本文我们按照场景来介绍一下常用的注解。
pollyduan
2019/11/04
1K0
【侠客行】Lombok深度解析
Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误。
大蕉
2019/09/23
6410
【侠客行】Lombok深度解析
lombok优缺点
最近上网查资料发现很多人对lombok褒贬不一,引起了我的兴趣,因为我们项目中也在大量使用lombok,大家不同的观点让我也困惑了几天,今天结合我实际的项目经验,说说我的个人建议。
崔笑颜
2020/12/29
2.1K0
Lombok 使用小结
Lombok 简介 Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注释实现这一目的。通过在开发环境中实现 Lo
静默虚空
2018/01/05
7220
Lombok快速入门
为什么说Lombok可以使代码更简洁、可以消除冗长代码呢?我们来拿lombok官网的一个例子来说:
端碗吹水
2020/09/23
1.1K0
Lombok快速入门
Lombok 让代码“亚健康”?你真的用对了吗?
周末的时候,和朋友闲聊,说最近在加班,赶进度,搞项目重构;然后跟我在吐槽,团队不让用Lombok,还列了一堆的缺点说让代码变的"亚健康",本来进度就挺赶的,因为一些基础的代码,消磨着精力和时间,心挺累的...
一行Java
2022/04/07
6230
Lombok 让代码“亚健康”?你真的用对了吗?
你干啥的?Lombok
说实话,我英文不太好(不是找借口,真的),但借助金山词霸,大致知道了这段英文的意思:Lombok 是个好类库,可以为 Java 代码添加一些“处理程序”,让其变得更简洁、更优雅。
沉默王二
2019/05/15
4640
Lombok
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or equals method again, with one annotation your class has a fully featured builder, automate your logging variables, and much more —— Project Lombok
晚上没宵夜
2021/07/19
4900
Lombok
Lombok使用指南
Lombok 是一款 Java 开发插件,使得 Java 开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的 Java 模型对象(POJO)。在开发环境中使用 Lombok 插件后,Java 开发人员可以节省出重复构建,诸如 hashCode 和 equals 这样的方法以及各种业务对象模型的 accessor 和 toString 等方法的大量时间。对于这些方法,Lombok 能够在编译源代码期间自动帮我们生成这些方法,但并不会像反射那样降低程序的性能。
一个正经的程序员
2022/04/11
1.2K0
Lombok使用指南
Lombok插件如此不好?但我选择继续使用…
最近发现几个大号都在转载一篇《Lombok是让你代码处于“亚健康”状态的真正元凶》的文章,特意仔细阅读了该文,文中的观点基本上都不敢苟同,个人还是会坚持使用Lombok,除非发现一些安全和性能方面的问题。
程序新视界
2020/10/28
7470
超级全面的 Lombok 注解介绍,学一波!
blog.csdn.net/riemann_/article/details/105374987
全栈程序员站长
2021/06/29
5K0
lombok使用基础教程
前言 lombok是一个编译级别的插件,它可以在项目编译的时候生成一些代码。在很多工具类的项目中都有这个功能。比如dagger。 通俗的说,lombok可以通过注解来标示生成getter settter等代码。我们自然可以通过编译器比如IDEA的Generate生成,为啥要用这个? 在项目开发阶段,一个class的属性是一直变化的,今天可能增加一个字段,明天可能删除一个字段。每次变化都需要修改对应的模板代码。另外,有的class的字段超级多,多到一眼看不完。如果加上模板代码,更难一眼看出来。更有甚者,由于字
Ryan-Miao
2018/03/14
1.7K0
lombok使用基础教程
java之Lombok
针对上面的介绍,我们简要说下它,首先它是一个java库,它通过注解的方式使你不用再为成员属性生成get/set等其它方法,就是说它简化了你程序的代码了,使程序的书写变简洁了。
码农王同学
2019/10/24
3720
这些极简的注解你都清楚吗
lombok 是一个非常神奇的 java 类库,会利用注解自动生成 java Bean 中烦人的 Getter、Setter,还能自动生成 logger、ToString、HashCode、Builder 等 java 特色的函数或是符合设计模式的函数,能够让你 java Bean 更简洁,更美观。lombok 的思想非常先进,它让我们省略繁琐的样板代码,不要在重复的代码上花费太长时间,它也是Java语言演进过程中必然出现的一种思想,要用20% 的时间做 80%的事情。下面就来看一下 lombok 的具体用法。
cxuan
2019/08/02
1.5K0
Lombok详解
1. Lombok简介 官网地址:https://projectlombok.org/ Lombok项目是一个Java库,它会自动插入您的编辑器和构建工具中,从而为你优化Java代码。 所以可以不用再手写一个getter、setter或equals方法。 2. 变量使用介绍 2.1 val修饰变量 可以使用val作为局部变量声明的类型,而不用实际编写该类型。 当您执行此操作时,将从初始值设定项表达式中推断出类型。 局部变量也将成为final类型的变量。 此功能仅适用于局部变量和foreach循环,不适用于字
牧晗
2020/06/05
1.3K0
Lombok详解
相关推荐
Java开发神器Lombok的安装与使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验