大家好,我是G探險者。
項目里,因為我使用了Lombok插件,然后代碼走查的時候被領導點名了。
我心想,這么好用的插件,為啥不推廣呢,整天寫那些煩人的setter,getter方法就不嫌煩么?
領導既然不讓用,自然有他的道理。
于是我查了一番關于lombok的一些緋聞。就有了這篇文章。
首先呢,Lombok 是一個在 Java 項目中廣泛使用的庫,旨在通過注解自動生成代碼,如 getter 和 setter 方法,以減少重復代碼并提高開發效率。然而,Lombok 的使用也帶來了一些挑戰和爭議,特別是關于代碼的可讀性和與 Java Bean 規范的兼容性。
Lombok 基本使用
示例代碼
不使用 Lombok:
public?class?User?{private?String name;private?int?age;public?String?getName()?{return?name;}public?void?setName(String name)?{this.name = name;}// 其他 getter 和 setter
}
使用 Lombok:
import?lombok.Data;@Data
public?class?User?{private?String name;private?int?age;// 無需顯式編寫 getter 和 setter
}
Lombok 的爭議
- 代碼可讀性和透明度:Lombok 自動生成的代碼在源代碼中不直接可見,可能對新開發者造成困擾。
- 工具和 IDE 支持:需要特定的插件或配置,可能引起兼容性問題。
- 與 Java Bean 規范的兼容性:Lombok 在處理屬性命名時可能與 Java Bean 規范產生沖突,特別是在屬性名以大寫字母開頭的情況。
下面我就列舉一個例子進行說明。
屬性命名的例子
假設有這么一個屬性,aName;
標準 Java Bean 規范下:
- 屬性?
aName
?的setter getter 方法應為?setaName() getaName()
。 - 但是 Lombok 可能生成?
getAName()
。
這是因為Lombok 在生成getter和setter方法時,將屬性名的首字母也大寫,即使它是小寫的。所以對于aName屬性,Lombok生成的方法可能是getAName()和setAName()。
在處理JSON到Java對象的映射時,JSON解析庫(如Jackson或Gson)會嘗試根據Java Bean規范匹配JSON鍵和Java對象的屬性。它通常期望屬性名的首字母在getter和setter方法中是小寫的。因此,如果JSON鍵為"aName",解析庫會尋找setaName()方法。
所以,當你使用Lombok的@Data注解,且Lombok生成的setter方法為setAName()時,JSON解析庫可能找不到匹配的方法來設置aName屬性,因為它尋找的是setaName()。
這種差異可能在 JSON 到 Java 對象的映射中引起問題。
Java Bean 命名規范
根據 Java Bean 規范,屬性名應遵循駝峰式命名法:
- 單個單詞的屬性名應全部小寫。
- 多個單詞組成的屬性名每個單詞的首字母通常大寫。
結論
Lombok 是一個有用的工具,可以提高編碼效率并減少冗余代碼。但是,在使用它時,團隊需要考慮其對代碼可讀性、維護性和與 Java Bean 規范的兼容性。在決定是否使用 Lombok 時,項目的具體需求和團隊的偏好應該是主要的考慮因素。