Lombok是有害的 · Gregor Riegler
Java是一種非常冗長的語言,註釋幾乎可以解決任何問題。對嗎? - 可是這是多麼危險的組合。
我完全明白了。我也很懶,所以使用Lombok,但除了複製貼上所有樣板程式碼外,您是否考慮過影響?
魔術是有害的
我的程式碼中不需要任何魔法。這會使行為不透明。它會讓您啟動偵錯程式,因為您實際上並不瞭解幕後發生的事情,而幕後不應該有什麼事情。出於經濟原因,一切都應該儘可能明確。
@ Data,@ Getter和@Setter是一種設計壞氣味
當我設計我的領域物件時,我想避免外部直接訪問,我希望這些物件代表一組完美封裝資料的行為。我偶爾會在我的值物件Value Objects上有一些公共欄位,但就只是這樣了。為什麼我要在這些物件上使用getters 或 setters?它們是應該通過特定方法修改資料的後門。這有點像Feature Envy和Anemic 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 EqualsBuilder和HashCodeBuilder派上用場。
@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外掛,它工作得很好。
相關文章
- paluch.biz - Lombok的資料類是有害的!為什麼我不再使用Lombok?Lombok
- lombok是怎麼用的Lombok
- 【譯】function.caller 被認為是有害的Function
- lombok的使用Lombok
- Lombok經常用,但是你知道它的原理是什麼嗎?Lombok
- [譯] 使用 `-force` 被認為是有害的;瞭解 Git 的 `-force-with-lease` 命令Git
- lombok版本 與 lombok plugins版本問題LombokPlugin
- 你幹啥的?LombokLombok
- WFH對健康有害嗎?
- Lombok生成get/set異常問題(Lombok缺陷)Lombok
- SpringBoot使用LomBokSpring BootLombok
- Eclipse lombok javaEclipseLombokJava
- sprintboot 配置 lombokbootLombok
- Lombok @Locked指南Lombok
- 大模型對AI研究有害?大模型AI
- Lombok的常用註解有哪些Lombok
- 記錄Jackson和Lombok的坑Lombok
- LomBok簡化POJOLombokPOJO
- Lombok使用指南Lombok
- LOMBOK使用詳解Lombok
- @Lombok注意事項Lombok
- Lombok常用註解Lombok
- 架構師應該多維度多視角地思考 - Gregor架構Go
- 什麼是惡意軟體?病毒,蠕蟲,特洛伊木馬等有害程式
- IDEA使用lombok外掛IdeaLombok
- Java效率工具之LombokJavaLombok
- Lombok——程式碼簡化Lombok
- Lombok 註解詳解Lombok
- Lombok 原理與實現Lombok
- Lombok介紹和配置Lombok
- @NoArgsConstructor、@Getter、@Setter註解及Lombok的使用StructLombok
- 在Lombok的加持下,“小狗”.equals(“老狗”) = trueLombok
- 一款好用的Java外掛 - LombokJavaLombok
- Lombok中@Builder和@SuperBuilder註解的用法LombokUI
- 使用Hibernate、JPA、Lombok遇到的有趣問題Lombok
- 一條指令徹底刪除掃描出來的有害程式
- Lombok 的@ToString導致的Maven編譯錯誤LombokMaven編譯
- SpringBoot 實戰 (三) | 使用 LomBokSpring BootLombok