Lombok是一個IDE插件 + library的組合,主要作用是用來減少Java的冗長(verbose),尤其是POJO類的getter與setter,建構式,toString,equals,hashCode等樣板程式(boilerplate code),或幫你注入Logger的實例。透過在POJO類別加上lombok的注釋@Data
,@Getter
,@Setter
,@ToString
,@EqualsAndHashCode
等。
例如原本沒使用lombok之前,一個Employee
POJO類別如下
public class Employee {
private int id;
private String name;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
使用lombok的@Data
,則getter和setter都可以省略了,因為lombok編譯後會幫你長出來,而IDE加入lombok插件以後在編輯器中也可以呼叫那些看不到的getter與setter,除了減少手動新增getter與setter的麻煩,還讓程式碼看起來非常清爽。
@Data
public class Employee {
private int id;
private String name;
private String email;
}
但參考了Java开发中用到的,lombok是什么?這篇討論後,了解到lombok其實並非那麼完美的工具,一開始碰到問題是在JPA Entity類使用@Data
,然後兩個有關聯的Entity設定了雙向一對多,多對一,結果導致未知的StackOverflowError
,結果要透過在@ToString
中設定排除foreign key的屬性才解決。
但最大的問題是lombok不是單純的library,還必須整合至你的IDE工具,否則IDE根本不知道你用了lombok,當然就不曉得程式中呼叫getter和setter從哪而來而出現一堆紅色叉叉,
引述知乎用户
...不过在 IDE 里,当你使用省略的方法时可能会标红(运行不会报错,因为 lombok 在编译时为你生成了这些代码,但编译前的 IDE 可不知道),因此需要通过 IDE 的插件配合使用。虽然可以省事,但我觉得还是不方便。你想啊,你用了这个特性,但是如果代码不是你一个人维护时,别人不知道这个东西会感觉莫名其妙的,然后用 IDE 打开发现一大片找不到方法…
我剛到新公司從既有的專案check out下來就碰到這個問題了,出現一堆紅色錯誤,還好同事在旁邊可以問才知道還要設定lombok至IDE,萬一沒人跟你講就要查半天了。
此外IDE必須支援lombok,沒有支援IDE就會報錯。
除了以上還有一些潛在的缺點,我覺得還是不要為了省一點的code而用這個工具比較好。
2019/10/7今天踩到一個坑,lombok的@Log4j2
會影響Spring bean的@Component
或@Service
的注入。如果發現bean一直無法注入,但檢查半天設定都正確,那最好試試把lombok的annotation拔掉並clean專案試試。
參考:
沒有留言:
張貼留言