当前位置:首页 > 科技  > 软件

为什么一些团队反对使用Lombok?

来源: 责编: 时间:2024-06-21 17:25:51 302观看
导读一、介绍Java,作为一款非常热门的编程语言,尽管它有着非常丰富的语言特性,完全面向对象编程,编程高度规范化,但是也有一个最受大家诟病的一个缺点:啰嗦,尤其是当你开发了很多年之后,你会明显的感受到,相比动态语言,java 定义变

一、介绍

Java,作为一款非常热门的编程语言,尽管它有着非常丰富的语言特性,完全面向对象编程,编程高度规范化,但是也有一个最受大家诟病的一个缺点:啰嗦,尤其是当你开发了很多年之后,你会明显的感受到,相比动态语言,java 定义变量之前,要先创建类,然后定义变量类型,每个类要写很多的get/set/toString/hashCode/equals等等方法。5W628资讯网——每日最新资讯28at.com

尤其是当一个实体类,高达几十个变量时,写完get、set方法之后,一个实体类的长度快接近一千行。5W628资讯网——每日最新资讯28at.com

图片图片5W628资讯网——每日最新资讯28at.com

为了避免写这些“罗嗦”的方法,很多程序员一直在寻觅着找一个能够使他们摆脱这种重复劳动工作的工具,例如:idea、eclipse 开发工具的快捷生成get、set方法的工具,还有我们今天要谈论的这个Lombok工具。5W628资讯网——每日最新资讯28at.com

二、Lombok

Lombok 是一款非常流行的代码简洁工具,利用它的注解特性,直接就可以帮我们省去高大几百行的get、set方法,操作非常方便。5W628资讯网——每日最新资讯28at.com

如果是idea开发工具,可以直接在preferences -> plugins里面搜索lombok,然后点击安装即可!5W628资讯网——每日最新资讯28at.com

图片图片5W628资讯网——每日最新资讯28at.com

接着,在项目工程中导入lombok依赖包!5W628资讯网——每日最新资讯28at.com

<dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.12</version>    <scope>provided</scope></dependency>

最后,只需要在对应的实体类上加上@Data注解,即可完成类属性get/set的注入。5W628资讯网——每日最新资讯28at.com

import lombok.Data;@Datapublic class User {    private String id;    private String age;    private String name;        //可以不用显式写get、set方法}

使用@Data注解在类上,这个实体类中的属性就不需要显式写get、set方法了。5W628资讯网——每日最新资讯28at.com

对这个类进行编译之后,我们打开User.class文件,看看编译后的文件内容长啥样?5W628资讯网——每日最新资讯28at.com

public class User {    private String id;    private String age;    private String name;    public User() {    }    public String getId() {        return this.id;    }    public String getAge() {        return this.age;    }    public String getName() {        return this.name;    }    public void setId(String id) {        this.id = id;    }    public void setAge(String age) {        this.age = age;    }    public void setName(String name) {        this.name = name;    }    public boolean equals(Object o) {        if (o == this) {            return true;        } else if (!(o instanceof User)) {            return false;        } else {            User other = (User)o;            if (!other.canEqual(this)) {                return false;            } else {                label47: {                    Object this$id = this.getId();                    Object other$id = other.getId();                    if (this$id == null) {                        if (other$id == null) {                            break label47;                        }                    } else if (this$id.equals(other$id)) {                        break label47;                    }                    return false;                }                Object this$age = this.getAge();                Object other$age = other.getAge();                if (this$age == null) {                    if (other$age != null) {                        return false;                    }                } else if (!this$age.equals(other$age)) {                    return false;                }                Object this$name = this.getName();                Object other$name = other.getName();                if (this$name == null) {                    if (other$name != null) {                        return false;                    }                } else if (!this$name.equals(other$name)) {                    return false;                }                return true;            }        }    }    protected boolean canEqual(Object other) {        return other instanceof User;    }    public int hashCode() {        int PRIME = true;        int result = 1;        Object $id = this.getId();        int result = result * 59 + ($id == null ? 43 : $id.hashCode());        Object $age = this.getAge();        result = result * 59 + ($age == null ? 43 : $age.hashCode());        Object $name = this.getName();        result = result * 59 + ($name == null ? 43 : $name.hashCode());        return result;    }    public String toString() {        return "User(id=" + this.getId() + ", age=" + this.getAge() + ", name=" + this.getName() + ")";    }}

很清晰的看到,使用@Data注解之后,User类新增了get、set、hashCode、equals和toString方法。5W628资讯网——每日最新资讯28at.com

通过上面的例子,大家可以发现,使用@Data注解可以大大减少了代码量,使代码非常简洁,这也是很多开发者热衷于使用Lombok的主要原因。5W628资讯网——每日最新资讯28at.com

Lombok的工作原理是怎么实现的呢?5W628资讯网——每日最新资讯28at.com

由于Java的官方版本没有提供这种快速生成方法的注解工具,类似Lombok这样的工具,其实都是使用了从Java 6和JSR 269的Annotation Processing技术中实现方法的注入。5W628资讯网——每日最新资讯28at.com

简单的说,就是使用了 Java 非公开的 API,在 javac 编译代码时,通过强类型转换获取JavacAnnotationProcessor对象,再从JavacAnnotationProcessor的方法里面拿到抽象语法树(AST)做强制修改,注入get、set等方法。5W628资讯网——每日最新资讯28at.com

使用Lombok这种方案,有个最大的好处,就是可以节省大量的重复代码,让代码更佳简洁!但是也有很多弊端!5W628资讯网——每日最新资讯28at.com

三、有哪些坏处呢?

3.1、强迫队友也安装 Lombok

当你在使用Lombok工具插件来快速开发项目的时候,如果别的同事也要和你一起协作开发项目,那么他不得不也要安装Lombok插件,不然项目编译会报错。5W628资讯网——每日最新资讯28at.com

3.2、代码可调试性降低

代码可调试性会降低,为什么会这么说呢?5W628资讯网——每日最新资讯28at.com

Lombok虽然给我们节省了get和set方法的编程,但是如果我想知道类的某个属性被哪些方法操作给set了,如果用原生的方法,可以很好的知道调用方。但是如果使用Lombok插件来生成,这个时候你根本无从得知。甚至没办法调试!5W628资讯网——每日最新资讯28at.com

3.3、不懂 Lombok 注解,会踩坑

我们知道,使用@Data会重写hashCode()和equals()方法,如果是单个实体类,没有继承的话,你使用@Data不会产生问题。5W628资讯网——每日最新资讯28at.com

但是如果这个实体类又继承了父类,@Data只会重写子类的hashCode()和equals()方法,不会把父类的属性加进去,这样就会导致,例如当你在使用HashMap的时候,用当前这个实体类作为key,可能会得到意想不到的结果。5W628资讯网——每日最新资讯28at.com

遇到这种情况,你可以在类上加上这个注解@EqualsAndHashCode(callSuper=true),子类的hashCode()和equals()方法会加入父类的属性。5W628资讯网——每日最新资讯28at.com

3.4、破坏封装性

封装是 java 面向对象编程中非常重要的一个特性。5W628资讯网——每日最新资讯28at.com

例如,针对User实体类,我新家一个tag属性,我只想暴露它的get方法,不想暴露set方法给外部,没有用@Data注解的时候,我可以很灵活的进行编程,但是使用@Data注解之后,属性tag被完全暴露在外界了。5W628资讯网——每日最新资讯28at.com

public class User {    private String id;    private String age;    private String name;    private String tag = "学生";    public String getTag() {        return tag;    }    }

3.5、影响 jdk 升级

其实以上的坑点,都不算什么很大的坑点,在我看来,最大的坑点其实就是Lombok的工作原理,使用了非官方支持的 API 接口,通过程序强制植入方式来修改类,实现get、set等方法的注入。5W628资讯网——每日最新资讯28at.com

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

假如某天JDK把这种后门堵住了,那Lombok基本上就不能用了,到时候又是个麻烦事情。5W628资讯网——每日最新资讯28at.com

四、总结

Lombok 作为一款非常流行的工具插件,肯定有它自身的优势所在,到底建不建议在日常开发中使用,我个人其实是一个中立的态度,如果你们团队的人都喜欢它,那推荐你使用,在使用之前,最好培训一下,有哪些坑点,避免踩坑。5W628资讯网——每日最新资讯28at.com

如果多数人不太喜欢用它,那就不推荐你使用,很多公司禁止你使用它的原因,其实这种插件有点类似那种流氓插件,工作原理不是官方所认可的方式来实现,假如某天新版本的 jdk 突然把这个漏洞给堵住了,那么项目想要升级 jdk,就比较困难。5W628资讯网——每日最新资讯28at.com

因此大家在评估要不要在代码中引入Lombok的时候,在想它的优点同时,能够考虑到它会带来的哪些问题,那么本文的目的也就达到了!5W628资讯网——每日最新资讯28at.com

五、参考

1、https://projectlombok.org/5W628资讯网——每日最新资讯28at.com

2、https://time.geekbang.org/column/article/1649075W628资讯网——每日最新资讯28at.com

3、http://blog.itpub.net/69908877/viewspace-2676272/5W628资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-95558-0.html为什么一些团队反对使用Lombok?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 接口性能优化的11个小技巧

下一篇: 如何设计一个秒杀系统,你学会了吗?

标签:
  • 热门焦点
  • 6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    2023年上半年已经正式过去了,我们也迎来了安兔兔V10版本,在新的骁龙8Gen3和天玑9300发布之前,性能榜的榜单大体会以骁龙8Gen2和天玑9200+为主,至于那颗3.36GHz的骁龙8Gen2领先
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    7月14日消息,今日一名博主在社交媒体发布了一张疑似小米汽车电池信息的照片,显示该电池包正是宁德时代麒麟电池,容量为101kWh,电压为726.7V,可以预测小
  • 利用职权私自解除被封帐号 Meta开除20多名员工

    11月18日消息,据外媒援引知情人士表示,过去一年时间内,Facebook母公司Meta解雇或处罚了20多名员工以及合同工,指控这些人通过内部系统以不当方式重置用户帐号,其
Top