Lombok是有害的 · Gregor Riegler

banq發表於2019-08-17

Java是一種非常冗長的語言,註釋幾乎可以解決任何問題。對嗎? - 可是這是多麼危險的組合。

我完全明白了。我也很懶,所以使用Lombok,但除了複製貼上所有樣板程式碼外,您是否考慮過影響?

魔術是有害的

我的程式碼中不需要任何魔法。這會使行為不透明。它會讓您啟動偵錯程式,因為您實際上並不瞭解幕後發生的事情,而幕後不應該有什麼事情。出於經濟原因,一切都應該儘可能明確。

@ Data,@ Getter和@Setter是一種設計壞氣味

當我設計我的領域物件時,我想避免外部直接訪問,我希望這些物件代表一組完美封裝資料的行為。我偶爾會在我的值物件Value Objects上有一些公共欄位,但就只是這樣了。為什麼我要在這些物件上使用getters 或 setters?它們是應該通過特定方法修改資料的後門。這有點像Feature EnvyAnemic Domain Model貧血模型。

此外,setter違背了我想讓大多數物件不可變的意圖。畢竟,不可變物件更容易重構。

那麼我在哪裡需要setter/getter這樣訪問器?也許在我的資料傳輸物件DTO上?為什麼我要將欄位設為私有並在僅為這些資料建立setter/getter這樣訪問器?這種資訊隱藏是否提供任何價值?對我來說,它只是雜亂無章。 直接使用public final欄位在這裡也許是一個更清潔的解決方案,比setter/getter這樣訪問器簡單直接。我就是這樣,不需要setter/getter這樣訪問器。

@AllArgsConstructor引入了位置的一致性問題

這個可怕的註釋將欄位的順序與其生成的建構函式引數的順序相結合。因此,當您重新排序欄位時,您實際上會破壞您的程式碼。那是一個非常可靠的位置

雙向物件關係導致堆疊溢位

因此,當您使用Lomboks equals,hashCode或toString實現時,雙向關聯將導致堆疊溢位是間接的。我並不是說雙向關聯是可取的,或者那些堆疊溢位並不明顯。我要說的是,如果Lombok稍微聰明一些,它可能已經避免了那些。

壞事不是堆疊溢位。事實是它隱藏在註釋背後。

Lombok外掛將擊中你的cpu

如果你不使用lombok外掛,lombok會給你帶來很多紅色程式碼行。如果你確實使用了lombok外掛,它會難為你的cpu。我所知道一個專案完成自動完成下拉時,在程式碼的特定區域載入15秒。這發生在i7處理器上,有大量的RAM和ssd。

Java版本大於8的相容性問題

當我嘗試將使用lombok的java 1.8專案遷移到java 11時,我遇到了問題。儘管我在網際網路上發現了已知的問題修復,但我還是無法在嘗試的2小時內再次使用它。Delombok來救援。

更新:好像我遇到了像類似的問題,要升級到Java 11。

如果lombok如此糟糕,還有什麼選擇?

我們可以回到顯式的pojo程式碼。一些libs,ide功能和外掛將幫助我們使用樣板。

1. equals和hashcode

對於值物件,你想要包含所有欄位,apache commons lang EqualsBuilderHashCodeBuilder派上用場。

@Override
public boolean equals(Object that) {
    return EqualsBuilder.reflectionEquals(this, that);
}
 
@Override
public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}

甚至可以使用這樣的intellij實時模板:

@Override
public boolean equals(Object that) {
    return org.apache.commons.lang3.builder.EqualsBuilder.reflectionEquals(this, that);
}

@Override
public int hashCode() {
    return org.apache.commons.lang3.builder.HashCodeBuilder.reflectionHashCode(this);
}

@ SLF4J

我建議再次使用intellij live模板。

// just put in 'className()' for the $CLASS$ variable
private static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger($CLASS$.class);

@Builder

我非常喜歡intellij外掛市場上免費提供的構建器生成外掛。

此外,還有一個新的Replace Constructor,現在可以使用Builder重構。但是,我更喜歡Inner Builder外掛。

Delombok案例

值得慶幸的是,有一個很棒的小功能叫做delombok。它會將你以前的所有lombok註釋轉換為他們在幕後建立的醜陋樣板,因此你可以完全擺脫它。不要指望一個美好的結果,生成的程式碼將包含很多@SuppressWarnings("all")。此外,我的intellij外掛的delombok功能導致我的ide堵塞。所以我不得不使用Lombok Maven外掛,它工作得很好。

相關文章