精华内容
下载资源
问答
  • 阅读本文大概需要 5.6 分钟。来自:ramostear.com/blog/2020/04/28/uk1860p8.html不得承认,Lombok 是一个很不错的 Java 库,它可以...

    阅读本文大概需要 5.6 分钟。

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

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

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

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

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

    @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,可以替换掉类名头上那坨像翔一样的东西:

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

    <END>

    IT技术分享社区

    个人博客网站:https://programmerblog.xyz

    文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

    展开全文
  • Lombok优点: 代码简洁,减少冗余代码。...比如使用lombok,想要看某个属性被哪些类调用,会很方便; 3、坑 4、影响jdk升级。如果项目中用到的多个jar包使用了不同的lombok版本,就需要进行版本仲裁; 5、 ...

    Lombok优点:
    代码简洁,减少冗余代码。

    Lombok缺点:
    1、侵入性太强。强制让同事在IDE中安装对应插件,更重要的是,如果我们定义的一个jar包中使用了lombok,那么要求所有依赖这个jar包的应用都必须安装插件;

    2、代码可读性、调试性低。因为lombok会自动生成很多代码,但这些代码是要在编译阶段才会生成,所以开发过程中,很多代码是缺失的;还有使用了lombok,想要看某个属性的set/get方法被哪些类调用,会很不方便;

    3、坑,盲目使用对自动生成的代码不够了解,会容易产生意想不到的结果;

    4、影响jdk升级。如果项目中使用了lombok,会导致如果lombok官方没有及时升级版本到对应的jdk,使用lombok的代码也无法升级到新的jdk版本;

    5、破坏封装行。使用lombok会自动给所有属性都加上get/set方法,暴露了不应该暴露的setter方法。而面向对象封装的定义是:通过访问权限控制,隐藏内部数据,外部仅能通过类提供的有限接口访问、修改内部数据。

    展开全文
  • 1、如果定义了一个小写字母开头,第二个字母是大写的属性...2、Lombok本质上是一个预处理程序,最大的问题是你看到的代码和编译器看到的代码一样,会导致很多问题无法及时发现,跟C的define类似,所以推荐使用 ...

    1、如果定义了一个小写字母开头,第二个字母是大写的属性,Lombok处理是不合规范的,Lombok作者表示已经无法修改了。2、Lombok本质上是一个预处理程序,最大的问题是你看到的代码和编译器看到的代码不一样,会导致很多问题无法及时发现,跟C的define类似,所以不推荐使用

    展开全文
  • Lombok什么好处? ** Lombok是一款非常实用Java工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO)。它通过注释实现这一目的。 如果大家对于Lombok比较了解的话,可以先跳过这一段,...

    **

    Lombok有什么好处?

    **
    Lombok是一款非常实用Java工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO)。它通过注释实现这一目的。

    如果大家对于Lombok比较了解的话,可以先跳过这一段,直接往后看,如果不是很熟悉的话,可以简单了解一下。

    想在项目中使用Lombok,需要三个步骤:

    一、IDE中安装Lombok插件

    目前Lombok支持多种IDE,其中包括主流的Eclips、Intellji IDEA、Myeclipse等都是支持的。

    在IDEA中安装方式如下:

    在这里插入图片描述

    二、导入相关依赖

    Lombok 支持使用多重构建工具进行导入依赖,目前主要支持maven、gardle、ant等均支持。

    如使用maven导入方式如下:
    在这里插入图片描述

    三、代码中使用注解

    Lombok精简代码的方式主要是通过注解来实现,其中常用的有@Data、@Getter/@Setter、@Builder、@NonNull等。

    如使用@Data注解,即可简单的定义一个Java Bean:
    在这里插入图片描述
    使用@Data注解在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor这些注解,对于POJO类十分有用。

    即自动帮忙给例子中的Menu类中定义了toString、Getter、Setter等方法。

    通过上面的例子,大家可以发现,我们使用@Data注解大大减少了代码量,使代码非常简洁。这也是很多开发者热衷于使用Lombok的主要原因。

    另外,关于Lombok的使用,不同人有不同的看法,因为很多人都使用过Lombok,对于他的优点都比较了解,所以接下来我们重点说一下Lombok的使用会带来哪些问题。

    Lombok有什么坏处?

    • 强X队友

    因为Lombok的使用要求开发者一定要在IDE中安装对应的插件。
    如果未安装插件的话,使用IDE打开一个基于Lombok的项目的话会提示找不到方法等错误。导致项目编译失败。
    也就是说,如果项目组中有一个人使用了Lombok,那么其他人就必须也要安装IDE插件。否则就没办法协同开发。
    更重要的是,如果我们定义的一个jar包中使用了Lombok,那么就要求所有依赖这个jar包的所有应用都必须安装插件,这种侵入性是很高的。

    • 代码可读性,可调试性低

    在代码中使用了Lombok,确实可以帮忙减少很多代码,因为Lombok会帮忙自动生成很多代码。

    但是这些代码是要在编译阶段才会生成的,所以在开发的过程中,其实很多代码其实是缺失的。

    在代码中大量使用Lombok,就导致代码的可读性会低很多,而且也会给代码调试带来一定的问题。

    比如,我们想要知道某个类中的某个属性的getter方法都被哪些类引用的话,就没那么简单了。

    • 有坑

    因为Lombok使代码开发非常简便,这就使得部分开发者对其产生过度依赖。

    在使用Lombok过程中,如果对于各种注解的底层原理不理解的话,很容易产生意想不到的结果。

    举一个简单的例子,我们知道,当我们使用@Data定义一个类的时候,会自动帮我们生成equals()方法 。

    但是如果只使用了@Data,而不使用@EqualsAndHashCode(callSuper=true)的话,会默认是@EqualsAndHashCode(callSuper=false),这时候生成的equals()方法只会比较子类的属性,不会考虑从父类继承的属性,无论父类属性访问权限是否开放。

    这就可能得到意想不到的结果。

    • 影响升级

    因为Lombok对于代码有很强的侵入性,就可能带来一个比较大的问题,那就是会影响我们对JDK的升级。

    按照如今JDK的升级频率,每半年都会推出一个新的版本,但是Lombok作为一个第三方工具,并且是由开源团队维护的,那么他的迭代速度是无法保证的。

    所以,如果我们需要升级到某个新版本的JDK的时候,若其中的特性在Lombok中不支持的话就会受到影响。

    • 还有一个可能带来的问题,就是Lombok自身的升级也会受到限制。

    因为一个应用可能依赖了多个jar包,而每个jar包可能又要依赖不同版本的Lombok,这就导致在应用中需要做版本仲裁,而我们知道,jar包版本仲裁是没那么容易的,而且发生问题的概率也很高。

    • 破坏封装性

    以上几个问题,我认为都是有办法可以避免的。但是有些人排斥使用Lombok还有一个重要的原因,那就是他会破坏封装性。

    众所周知,Java的三大特性包括封装性、继承性和多态性。

    如果我们在代码中直接使用Lombok,那么他会自动帮我们生成getter、setter 等方法,这就意味着,一个类中的所有参数都自动提供了设置和读取方法。

    举个简单的例子,我们定义一个购物车类:
    在这里插入图片描述
    我们知道,购物车中商品数目、商品明细以及总价格三者之前其实是有关联关系的,如果需要修改的话是要一起修改的。

    但是,我们使用了Lombok的@Data注解,对于itemsCount 和 totalPrice这两个属性。虽然我们将它们定义成 private 类型,但是提供了 public 的 getter、setter 方法。

    外部可以通过 setter 方法随意地修改这两个属性的值。我们可以随意调用 setter 方法,来重新设置 itemsCount、totalPrice 属性的值,这也会导致其跟 items 属性的值不一致。

    而面向对象封装的定义是:通过访问权限控制,隐藏内部数据,外部仅能通过类提供的有限的接口访问、修改内部数据。所以,暴露不应该暴露的 setter 方法,明显违反了面向对象的封装特性。

    好的做法应该是不提供getter/setter,而是只提供一个public的addItem方法,同时去修改itemsCount、totalPrice以及items三个属性。

    总结

    本文总结了常用的Java开发工具Lombok的优缺点。

    优点是使用注解即可帮忙自动生成代码,大大减少了代码量,使代码非常简洁。

    但是并不意味着Lombok的使用没有任何问题,在使用Lombok的过程中,还可能存在对队友不友好、对代码不友好、对调试不友好、对升级不友好等问题。

    最重要的是,使用Lombok还会导致破坏封装性的问题。

    虽然使用Lombok存在着很多方便,但是也带来了一些问题。

    但是到底建不建议在日常开发中使用,我其实保持一个中立的态度,不建议大家过度依赖,也不要求大家一定要彻底不用。

    展开全文
  • 为什么不推荐使用Lombok

    千次阅读 2021-12-23 09:37:04
    首先见一下什么Lombok什么Lombok? 我们来看一下Lombok的官网介绍,地址:https://projectlombok.org 我们翻译来看一下: Lombok项目是一个Java库,它会自动插入您的编辑器和构建工具中,从而使您的...
  • @Date:加在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor这些注解,但是提供的 getter、setter 方法都是 public 的
  • Lombok在给我们带来便利的同时,也带来了小的隐患。 鉴于自己踩过的许多坑,所以我从不主动推荐别人使用Lombok,但是,也并不会干涉他人使用。并且,因为我身边有些同事的代码还是使用了的,所以我也被迫的要安装...
  • 主要介绍了解决IDEA2020.1版本兼容Lombok的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 使用Kotlin已经引起了很多人的问题,在计算器上与其他地方的一些问题在现有的Java项目中使用Kotlin(见 , , , , , , ) 查看它,有一些建议可以使用Kapt和/或Delombok,但是没有明确的指导,直到我找到:...
  • 主要介绍了IDEA下lombok安装及找到get,set的问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Lombok最全使用详解

    2020-12-20 22:15:34
    这里写自定义目录标题作者为什么使用LombokLombok官网的介绍运行原理Lombok的安装1、添加依赖2、添加插件(推荐)常用注解举例说明【1】@Getter @Setter【2】@ToString【3】@EqualsAndHashCode【4】NonNull【5】...
  • Lombok作为依赖项添加到Java项目中(请确保您使用的是最新版本,以避免出现问题!)或 安装 打开VS Code,然后按Ctrl + Shift + X打开扩展程序管理器。 键入lombok ,然后单击安装。 询问时重新加载VS Code。 ...
  • (1)、当你的IDE是Idea时,要注意你的Idea是支持Lombok的,如果支持请更换高版本尝试(这里采用2018 3.3)。 (2)、在使用Lombok时,你的编辑器可能会报错,这时请在你的IDE中安装Lombok插件(如果使用的Idea则...
  • lombok

    2019-08-04 01:11:05
    NULL 博文链接:https://mzl-2011.iteye.com/blog/2010023
  • java使用Lombok插件,解决lombok不起作用原因 1. lombok插件可以省略实体类的get和set方法,有自动配置功能 (1)既然是插件,那就肯定要maven的依赖 <dependency> <groupId>org.projectlombok</...
  • lombok 生效

    2021-07-06 15:00:50
    IDEA 下配置lombok不生效 1.检查是否下载插件 2.依赖是否添加 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12...
  • 迷茫了,我们到底该用lombok

    千次阅读 2020-12-27 11:35:00
    题外注:好不好,你得试过才知道,不要看几篇文章,连尝试都没有尝试就去黑他,lombok发展到这么普及,总能是一无是处。玩笑话,只要代码lombok,出了问题都是lombok的问题...
  • lombok插件

    2018-03-19 10:45:25
    lombok插件,放到开发工具目录下。 在eclipse.ini文件中添加 -Xbootclasspath/a:lombok.jar -javaagent:D:\eclipse7\lombok.jar
  • 啥不用Lombok

    千次阅读 2019-06-15 00:00:40
    啥不用Lombok? 因为@Data有坑 当设置@EqualsAndHashCode(callSuper=true)时,会调用父类的equals()方法,假设父类是Object,Object默认的euqals()方法会是判断两个类地址是不是相等,等于说这样间接的把子类的...
  • Java 开发中到底该 Lombok

    千次阅读 2019-05-14 07:55:31
    Lombok !爱它的人爱的要死,觉得它简直就是先进生产力的代表;讨厌它的人讨厌的要死,觉得它简直就是邪恶世界的轴心。今天松哥也小心翼翼的来和大家聊一聊这个话题:Java...
  • 昨天升级了androidstudio,lombok版本兼容了,market升级了,卸载后,重新查找也找到了(可能是因为我没有翻墙的原因)。 后来就想找离线安装的办法, 然而没有找到,所以就自己搞了一下,将过程记录下来,...
  • lombok.zip(lombok.jar)

    2019-06-13 11:09:30
    lombok.jar: 介绍:通过简单注解来实现精简代码来达到消除冗长代码的目的。 优点:提高编码效率、使代码更简洁、消除冗长代码、避免修改字段名时忘记修改方法名.
  • lombok文件jar包

    2018-04-11 10:36:33
    lombok使用: 1:使用cmd安装eclipse的插件 2:eclipse的lombok的jar包引用 3:在实体类写注释.(重启eclipse自动生成)
  • IDEA2020中lombok不使用怎么办?

    千次阅读 2021-01-27 16:29:58
    本人使用的是IDEA最新版本,lombok自带,但是版本没更新。 分两种情况: 1、如果你和我遇到一样的问题,现在需要做三件事 (1)将自带的卸载 (2)下载新版本的lombok 下载完成解压, (3)将新版本更新到IDEA ...
  • lombok插件eclipsejar包

    2019-09-08 16:19:51
    lombok插件eclipsejar包 1将lombok.jar包复制到myeclipse.ini/eclipse.ini所在文件目录2 打开myeclipse.ini/eclipse.ini,在最后添加以下代码并保存:  -Xbootclasspath/a:lombok.jar -javaagent:lombok.jar
  • lombok.jar

    2019-04-21 16:03:56
    Mac系统,从github上或者其他地方获取项目,在idea上跑起来总是无法识别get和set方法,试过网上很多教程无非是安装lombok插件和勾选Enable annotation processing等都不行,还是手动安装靠谱,直接把jar包导入项目中...
  • lombok.zip

    2020-05-19 10:18:19
    lombok-plugin-0.25-2019.1.1.zip
  • lombok 1.18.16

    2020-11-09 15:23:12
    lombok 1.18.16,2020.11.9 从官网下载的:https://projectlombok.org/download

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 159,561
精华内容 63,824
关键字:

为什么不让用lombok