专栏首页程序员小灰Lombok!代码简洁神器还是代码“亚健康”元凶?

Lombok!代码简洁神器还是代码“亚健康”元凶?

关于Lombok,DD是一个重度用户,从我编写的Spring Boot教程还是Spring Cloud教程中,都可以看到几乎每个例子里都有很多地方会用到,尤其是set和get生成,以及构造函数的生成。

因为我觉得非常好用,所以也经常会在这里分享一些关于Lombok的文章。但每次的分享也都会收到一些关于Lombok不好的观点。

昨晚正好看到一篇关于Lombok的分享内容,作者认为Lombok虽然可以帮助我们干掉很多模板代码,但同时也会带来一些其他隐患。下面就来一起看看,Lombok到底会给我们带来哪些潜在问题吧!


以下内容转载自:toutiao.com/a6820517160964588044/

我承认,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
@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+
            "}";
    }
}

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

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

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

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

经过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的主要原因吧,这就像一个肥胖的人逐渐变成一个身材苗条的人。同时也让你看到了一个现象:你以为程序员很懒吗?其他有些时候他们比你想象中的还要懒。在爽的同时,也为代码种下了祸根。

如果您正在学习Spring Boot,推荐一个连载多年还在继续更新的免费教程:http://blog.didispace.com/spring-boot-learning-2x/

扭曲的审美,爱的隐患

扭曲的审美,导致了被审视的对象处于亚健康状态。使用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,请与你的团队多沟通和三思。


那么,你觉得Lombok怎么样呢?是代码神器?还是亚健康元凶?留言说说你的看法吧!

本文分享自微信公众号 - 程序员小灰(chengxuyuanxiaohui),作者:翟永超

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    不得不承认,Lombok 是一个很不错的 Java 库,它可以让你在少写代码的同时耍耍酷,简单的几个注解,就可以干掉一大片模板代码。但是,所有的源代码很多时候是...

    全栈程序员站长
  • 为什么有些公司不让用 Lombok ?

    来自:ramostear.com/blog/2020/04/28/uk1860p8.html

    良月柒
  • 再见!Lombok ...

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

    java进阶架构师
  • 为什么要放弃 Lombok ?

    如果您正在阅读此文,想必您对Project Lombok已经有了一段时间的了解。您是否正准备拥抱Lombok?还是正准备将如此酷炫的项目推荐给你的团队?如果您准...

    xcbeyond
  • Lombok插件如此不好?但我选择继续使用…

    最近发现几个大号都在转载一篇《Lombok是让你代码处于“亚健康”状态的真正元凶》的文章,特意仔细阅读了该文,文中的观点基本上都不敢苟同,个人还是会坚持使用Lo...

    程序新视界
  • 疫情砸场,电商后浪有多强?

    电商虽然也艰难,但疫情期间无法出门只能网购,疫情过后网购习惯得以保留,所以同比去年仍然保持正增长。有人还说「新冠帮了电商的忙」。这真能算帮忙吗?

    用户1569917
  • 白领体检异常率连年走高,这5本书教你怎样科学养生

    ▲有意思报告制作,数据来源:上海外服集团×第一财经周刊,《2018上海白领健康指数报告》

    华章科技
  • 7点建议助您写出优雅的Java代码!

    在每一位刚入行的程序员的心中,编写程序都是一门神圣的艺术创作。他们无不希望自己的代码作品既简洁清晰,又可读性强,而且还具有一定的容错能力。

    Java技术栈
  • 对话哈佛基因组计划老年组负责人:如何通过饮食延长大脑寿命

    大数据文摘
  • 通过深度学习识别和验证基于脑额叶区-后叶区功能失衡的重大精神疾病内的亚型

    精神分裂症(SZ)、双相情感障碍(BD)和重性抑郁症(MDD)是在精神疾病领域常见的三种疾病,合称为重大精神疾病(MPD),长期以来都是依据不同的核心症状被作为...

    悦影科技
  • 通过深度学习识别和验证基于脑额叶区-后叶区功能失衡的重大精神疾病内的亚型

    精神分裂症(SZ)、双相情感障碍(BD)和重性抑郁症(MDD)是在精神疾病领域常见的三种疾病,合称为重大精神疾病(MPD),长期以来都是依据不同的核心症状被作为...

    悦影科技
  • Bioinformatics | CLEP:用于生成患者表征的混合数据和知识驱动框架

    今天给大家介绍由弗劳恩霍夫算法与科学计算研究所、波恩大学的Vinay Srinivas Bharadhwaj主导,多个机构合作发表在Bioinformatics...

    DrugAI
  • 芝加哥:AI破获连环杀人案

    Ⅰ• AI- ? ‍‍‍‍‍追捕一个连环杀手,据专家称,这是一个绝对的不同类型的凶杀案的侦探工作。几十年前的研究者在这超专业领域已转向技术。2017这意味着AI...

    企鹅号小编
  • 中国人健康的头号杀手,3.3亿人中招

    年轻人觉得自己离死亡最近的时刻,通宵后的胸口一疼一定能高票入选。每次熬夜复习、工作、蹦迪过后,总害怕下一秒就会倒地不起,成为社会新闻里的又一个猝死者。

    华章科技
  • 你说的案发时间和Apple Watch讲的不一样!

    一起表面看来是行窃杀人的案件,其实却是死者亲属的亲手策划,而让真相水落石出的,竟是一块小小的智能手表。如今,健身追踪器和它们收集的数据已经成为了刑事调查的得力助...

    大数据文摘
  • Brain: 利用机器学习揭示精神分裂症两种不同的神经解剖亚型

    越来越多的研究表明传统的精神疾病诊断体系有很大的局限性。被临床医生诊断为同一种疾病的群体,可能有很大的不一致性。同时被诊断为几种疾病的人,可能表现出同样的临床症...

    悦影科技
  • 7 点建议助您写出优雅的 Java 代码!

    在每一位刚入行的程序员的心中,编写程序都是一门神圣的艺术创作。他们无不希望自己的代码作品既简洁清晰,又可读性强,而且还具有一定的容错能力。

    芋道源码
  • 七点建议助您写出优雅的Java代码

    在每一位刚入行的程序员的心中,编写程序都是一门神圣的艺术创作。他们无不希望自己的代码作品既简洁清晰,又可读性强,而且还具有一定的容错能力。

    良月柒
  • 【侠客行】Lombok深度解析

    Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/sett...

    大蕉

扫码关注云+社区

领取腾讯云代金券