Lombok!代碼簡潔神器還是代碼“亞健康”元兇?
共 11321字,需瀏覽 23分鐘
·
2024-05-16 08:00
點擊關(guān)注公眾號:互聯(lián)網(wǎng)架構(gòu)師,后臺回復 2T獲取2TB學習資源!
大家好,我是互聯(lián)網(wǎng)架構(gòu)師!
如果您正在閱讀此文,想必您對Project Lombok已經(jīng)有了一段時間的了解。您是否正準備擁抱Lombok?還是正準備將如此酷炫的項目推薦給你的團隊?如果您準備那么做,不妨聽聽我在使用Lombok一年后的一些感受。
我承認,Lombok是一個很不錯的Java庫,它可以讓你在少寫代碼的同時耍耍酷,簡單的幾個注解,就可以干掉一大片模板代碼。但是,所有的源代碼很多時候是用來閱讀的,只有很少的時間是用來執(zhí)行的(你可以細品這句話)。
一年以前,我和大多數(shù)人都認為Lombok的出現(xiàn)會讓Java的編碼體驗會更好,并極力的在我的團隊中推薦使用Lombok。一年以后,我開始對此產(chǎn)生顧慮,尤其是在我準備為開源的博客系統(tǒng)Una-Boot升級Java版本時,我才意識到Lombok自己掉入了一個戲法陷阱。在我進一步分析其源代碼并理解相關(guān)注解的工作原理后,發(fā)現(xiàn)我并不需要使用一個非標準的第三方庫將Java轉(zhuǎn)換為一個精巧而酷炫的語言。引入Lombok讓我的項目一時爽,但一時爽的代價是隨著項目推進,技術(shù)債務(wù)開始累積。
愛的開始,恨的起源
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+
"}";
}
}
@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就這點能耐?它還能讓你代碼的“身材”更苗條,更魔鬼。上面的代碼仍然還有改進的空間,我們可以用@EqualsAndHashCod注解替換到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注解去掉對于的方法:
@Getter
@Setter
@EqualsAndHashCode
@ToString
public class MyObject{
private Long id;
private String name;
private int age;
private int gender;
}
@Data,可以替換掉類名頭上那坨像翔一樣的東西:
@Data
public class MyObject{
private Long id;
private String name;
private int age;
private int gender;
}
@Slf4j,@NoArgsConstructor,@AllArgsConstructor等等,介紹Lombok用法不是本文重點。
扭曲的審美,愛的隱患
1. JDK版本問題
2. 脅迫使用
3. 可讀性差
@AllArgsConstructor注解,它將提供一個巨型構(gòu)造器,讓外界有機會在初始化對象時修改類中所有的屬性。首先,這是極其不安全的,因為類中某系屬性我們是不希望被修改的;另外,如果某個類中有幾十個屬性存在,就會有一個包含幾十個參數(shù)的構(gòu)造器被Lombok注入到類中,這是不理智的行為;其次,構(gòu)造器參數(shù)的順序完全由Lombok所控制,我們并不能操控,只有當你需要調(diào)試時才發(fā)現(xiàn)有一個奇怪的“小強”在等著你;最后,在運行代碼之前,所有JavaBean中的方法你只能想象他們長什么樣子,你并不能看見。
4. 代碼耦合度增加
5. 得不償失
總結(jié)
Lombok本身是一個優(yōu)秀的Java代碼庫,它采用了一種取巧的語法糖,簡化了Java的編碼,為Java代碼的精簡提供了一種方式,但在使用此代碼庫時,需要了解到Lombok并非一個標準的Java庫。使用Lombok,會增加團隊的技術(shù)債務(wù),降低代碼的可讀性,增大代碼的耦合度和調(diào)式難度。雖然在一定程度上Lombok減少了樣板代碼的書寫,但也帶來了一些未知的風險。如果你正在參與一個團隊項目(或大型項目),考慮到后續(xù)的升級與擴展,是否使用Lombok,請與你的團隊多溝通和三思。
最后,關(guān)注公眾號互聯(lián)網(wǎng)架構(gòu)師,在后臺回復:2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全。
正文結(jié)束
推薦閱讀 ↓↓↓
正文結(jié)束
