我抵赖,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@Setterpublic 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@EqualsAndHashCodepublic 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@ToStringpublic class MyObject{    private Long id;    private String name;    private int age;    private int gender;}

通过Lombok的戏法之后,相比一开始的代码,看起来是不是很酷炫,很苗条,很性感?你认为到此为止了?远不止于此。你会发现类名上一大坨注解看起来好顺当,Lombok提供了一个组合注解@Data,能够替换掉类名头上那坨像翔一样的货色:

@Datapublic 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/spr...

扭曲的审美,爱的隐患

扭曲的审美,导致了被扫视的对象处于亚健康状态。应用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怎么样呢?是代码神器?还是亚健康首恶?留言说说你的认识吧!

本文转自:程序猿DD
内容转载自:toutiao.com/a6820517160964588044/