AdSense

網頁

2018/6/21

Lombok 使用lombok的問題

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專案試試。

參考:

沒有留言:

AdSense