当前位置: 首页 > 科技观察

新的技术总监,禁止我们使用Lombok!

时间:2023-03-18 12:47:45 科技观察

前天我有个同学在一家互联网小公司做Java后端开发。最近,他们公司来了一位新的技术总监。这位技术总监非常注重技术细节。他来公司后推出了很多“政策”,比如定义了很多开发规范、日志规范,甚至要求大家统一使用某种IDE。不过这些都不是我和师弟抱怨的重点。他真正向我抱怨的是,他无法理解新来的技术总监居然禁止公司内部所有开发使用Lombok。但是,没有给出明确和令人信服的理由。于是他就来找我聊天,问我这个要求合理吗。关于这件事,我觉得技术总监的出发点是好的,但是他的做法有点偏激。之所以说起点好,是因为使用Lombok确实会带来很多问题,我个人在工作中并不主动使用。之所以不主动使用,是因为有些同事的代码还在用,所以也被逼装了Lombok的插件。既然谈到了这个话题,我就简单谈谈我的一些看法。龙目岛有什么好处?Lombok是一个非常有用的Java工具,可用于帮助开发人员消除Java中冗长的代码,尤其是对于简单Java对象(POJO)。它通过注释来做到这一点。如果你对Lombok比较了解,可以先跳过这一段,直接往回看。如果不是很熟悉,可以简单了解一下。在项目中使用Lombok需要三个步骤:1.在IDE中安装Lombok插件目前Lombok支持多种IDE,包括主流的Eclipse、IntelljiIDEA、Myeclipse等,IDEA中的安装方法如下:2.导入相关依赖Lombok支持使用多种构建工具导入依赖。目前主要支持maven、gardle、ant等。例如maven的导入方式如下:org.projectlomboklombok1.18.12provided3.在代码中使用注解Lombok的精简代码主要是通过注解实现的,其中常用的有@Data、@Getter/@Setter、@Builder、@NonNull等。如果你使用@Data注解,你可以简单地定义一个JavaBean:importlombok.Data;@DatapublicclassMenu{privateStringshopId;privateStringskuMenuId;privateStringskuName;}在类上使用@Data注解等同于使用@ToString,@EqualsAndHashCode,@Getter同时,@Setter和@RequiredArgsConstrutor对POJO类非常有用。即自动帮助在示例中的Menu类中定义toString、Getter、Setter等方法。通过上面的例子可以发现,我们使用了@Data注解,大大减少了代码量,让代码变得非常简洁。这也是很多开发者热衷于使用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等方法,也就是说一个类中的所有参数都会自动提供设置和读取方法。举个简单的例子,我们定义一个购物车类:@DatapublicclassShoppingCart{//商品数量privateintitemsCount;//总价privatedoubletotalPrice;//商品详情privateListitems=newArrayList<>();}//Examplefrom《极客时间-设计模式之美》us之前知道购物车中的商品数量、商品详情、总价其实是有关联的,如果需要修改,必须一起修改。但是,我们对两个属性itemsCount和totalPrice使用了Lombok的@Data注解。尽管我们将它们定义为私有类型,但我们提供了公共的getter和setter方法。外部用户可以通过setter方法自由修改这两个属性的值。我们可以随意调用setter方法来重新设置itemsCount和totalPrice属性的值,这也会导致它们与items属性的值不一致。面向对象封装的定义是:通过访问控制,隐藏内部数据,外部只能通过类提供的有限接口访问和修改内部数据。因此,将不应该暴露的setter方法暴露出来显然违反了面向对象的封装特性。好的做法是不提供getter/setter,只提供一个publicaddItem方法,同时修改itemsCount、totalPrice、items三个属性。小结本文总结了常用的Java开发工具Lombok的优缺点。好处是使用注解可以帮助自动生成代码,大大减少代码量,使代码非常简洁。但是不代表Lombok的使用没有问题。在使用Lombok的过程中,可能还会遇到对队友不友好、对代码不友好、对调试不友好、对升级不友好等问题。最重要的是,使用Lombok还会导致破坏封装的问题。虽然使用Lombok有很多便利,但也带来了一些问题。但是在日常开发中是否推荐使用,我其实是保持中立态度的。我不建议你过分依赖它,也不要求你完全使用它。只要大家在使用它的时候,或者在评估是否在代码中引入Lombok之前,在想到它的优势的同时,能够考虑到它给代码带来的问题,那么本文的目的就达到了!参考资料:https://time.geekbang.org/column/article/164907https://projectlombok.org/