Lombok,自动值和不可变项
我喜歡布蘭登(Brandon )在博客文章中比較Project Lombok , AutoValue和Immutables的建議 ,而這篇文章試圖做到這一點。 我已經簡要概述了Project Lombok , AutoValue和Immutables ,但是這篇文章有所不同,因為它突出了它們之間的異同。
Lombok, AutoValue和Immutables有很多共同點,我嘗試在這單個描述語句中總結這些相似之處:Lombok,AutoValue和Immutables使用注釋處理為值對象類使用的常見操作生成樣板代碼。 本文的其余部分將更詳細地探討這些相似之處,并對比三種方法。
代碼生成
Lombok,AutoValue和Immutables均旨在從簡潔的代碼表示形式生成詳細的樣板代碼,這些代碼表示形式專注于高級業務邏輯,而將實現的低級細節留給代碼生成。 常見的對象方法(例如toString() , equals(Object)和hashCode())很重要,但需要正確編寫。 容易犯這些錯誤,即使最初正確地編寫了這些錯誤(包括通過IDE生成),但在對類產生影響的其他更改時也可以忽略它們。
價值對象
Lombok , AutoValue和Immutables均支持生成“ 值對象” 。 雖然AutoValue嚴格執行值對象的生成,但是如果指定了@Modifiable ,則Immutables允許生成的對象是可修改的,并且Lombok在其生成的類中使用@Set和@Data等批注支持多級修改。
超越價值對象
AutoValue專注于值對象的生成,并基于模板類中的抽象方法,支持字段,構造器/生成器,具體訪問器方法以及常見方法equals(Object) , hashCode()和toString()的實現的生成。
Immutables提供的功能類似于AutoValue提供的功能,并添加了使用@ Value.Modifiable生成可修改類的功能 。 不可變對象還提供其他功能 ,包括:
- 單例實例
- 預先計算的哈希碼
- 實例實習
- 可自定義的equals(Object),hashCode()和toString()實現,包括從中排除字段
- 基本和高級序列化
Lombok通過@Value注釋提供類似于AutoValue的值類生成功能,并提供通過@Data注釋生成可修改類的功能。 Lombok還提供其他功能 ,包括:
- 資源清理
- 記錄器字段生成
- 同步對象鎖
- 潛入檢查的異常
基于注釋處理
Lombok , AutoValue和Immutables都通過注釋處理從更簡潔的模板代碼中生成了更詳細的樣板代碼。 每個都包括在其JAR文件的META-INF/services區域javax.annotation.processing.Processor定義的javax.annotation.processing.Processor ,作為javac編譯器一部分的標準注釋處理器發現過程的一部分 。
并非所有注釋處理都相同
盡管Lombok,AutoValue和Immutables都通過javac進行注釋處理 ,但是Lombok如何使用注釋處理的細節與AutoValue和Immutables的處理方法不同。 AutoValue和Immutables在更常規的意義上使用注釋處理,并從源生成源。 由AutoValue和Immutables生成的類源代碼的名稱與模板類不同,實際上是擴展了模板類。 AutoValue和Immutables都讀取模板類,并在Java源代碼中生成一個具有自己名稱的全新類,該類具有所有生成的方法和字段。 這避免了與模板類的任何名稱沖突,并且使模板類源代碼和生成的類源代碼在同一IDE項目中的混合相當容易,因為它們實際上是不同的類。
通過注釋處理生成AutoValue
通過注釋處理生成不可變對象
Lombok通過與AutoValue和Immutables不同的批注處理來實現生成。 Lombok生成具有與“模板”源代碼相同的類名的已編譯.class文件,并將生成的方法添加到此已編譯版本中。 開發人員僅在查看.java文件時會看到簡潔的模板代碼,而在查看.class文件時會看到源代碼中不存在的方法的編譯后的.class文件。 Lombok生成的不是另一個源文件,而是原始源的增強編譯版本。 有一個delombok選項可以與Lombok一起使用,以查看增強的.class文件背后的生成源是什么樣子,但是該項目的真正目的是將其從簡潔的模板源直接轉換為增強的編譯類,而無需使用或使用中間的增強功能。源文件。 delombok選項可用于查看生成的源的外觀,或者,更重要的是,可以在將其與工具混淆以使源(簡潔的.java文件)和生成的類(生成的類)不一致的情況下使用.class同一名稱的.class文件)。
Lombok通過注釋處理生成
Lombok的注釋處理方法不像AutoValue和Immutables所采用的方法那么傳統,包括Lombok的創建者在內的一些人將這種方法稱為“ hack” 。 Neildo在發布的Lombok – Trick Explained項目中很好地解釋了Lombok的“技巧”或“ hack”,并引用了內容豐富的OpenJDK編譯概述 。
圍繞Lombok的方法引起爭議的主要原因是密切相關的,并且它使用的是非標準API,因此很難與IDE和執行自己的編譯的其他工具(例如javadoc )很好地集成。 因為AutoValue和Immutables自然會使用新的類名生成源代碼,所以任何傳統工具和IDE都可以將生成的源代碼與模板源代碼一起使用,而不會出現任何重大問題。
異同摘要
| 1.16.8 ( 2016年 ) | 1.2 ( 2016 ) | 2.2.8 (2016年) | 此帖子使用的版本 | 
| 2009年 | 2014年 | 2014年 | |
| 麻省理工 ( 也 ) | 阿帕奇2 | 阿帕奇2 | 全部開源 | 
| 1.6 | 1.6 | 1.7 | 支持的最舊的Java版本 | 
| ASM ( 用于Eclipse集成 ) | ASM | (可選) 運行時依賴項 : Guava | 編譯時依賴(包含)的庫 | 
| lombok.launch.AnnotationProcessorHider $ AnnotationProcessor | com.google.auto.value.processor.AutoAnnotationProcessor com.google.auto.value.processor.AutoValueBuilderProcessor com.google.auto.value.processor.AutoValueProcessor | org.immutables.processor.ProxyProcessor | 標準注釋處理器規范位置 | 
| 增強的生成類替換模板源 | 生成的源擴展了模板源 | Lombok僅顯示帶有“ delombok”選項的生成源 | |
| 指定delombok選項 | 默認 | 默認 | 查看/控制生成的源代碼 | 
| equals(Object) , hashCode() , toString() , 構造 /生成器 , 訪問器 , 設置器 | equals(Object),hashCode(),toString(),構造/生成器,訪問器 | equals(Object) , hashCode() , toString() , 構造 /生成器 ,訪問器, 設置器 | |
| 允許使用字段級@Set進行完全可變,但在需要不可變性時提供@Value | 加強嚴格的不變性 | “ 偏重于不變性 ”,但提供了類級別的@ Value.Modifiable | AutoValue的意見最多,Lombok的意見最少 | 
| 資源清理 不可變或可變 偷偷地拋出檢查異常 對象同步鎖 記錄注釋 更多 … | 忠實于價值客體的概念 記錄的最佳做法 | 樣式定制 序列化 (包括JSON ) 預先計算的哈希碼 更多… | 
選擇時的注意事項
Lombok,AutoValue和Immutables是類似的工具包,它們提供類似的好處,并且這三種方法中的任何一種都可以被廣泛的應用程序成功使用。 但是,在選擇使用哪個工具箱時,可以考慮它們之間的差異。
-  Lombok生成的類和模板具有相同的包和類名,而AutoValue和Immutables生成的類擴展了模板類并具有自己的類名(但具有相同的包)。 - 希望編譯的.class文件具有與模板類完全相同的包和名稱的開發人員將首選Lombok。
 
-  AutoValue是這三個工具包中最自以為是的,而Lombok則是最不自以為是的。 - 希望嚴格執行“值對象”特征的開發人員可能更喜歡AutoValue。
 
-  AutoValue和Immutables使用標準注釋處理,而Lombok使用非標準注釋處理方法。 - 希望避免非標準依賴關系的開發人員將傾向于使用AutoValue或Immutables。
 
-  這三個工具箱都支持某種程度的自定義,并且希望自定義生成的代碼的開發人員可能希望選擇允許他們以所需方式自定義生成的代碼的工具箱。 - Lombok提供了一種配置系統 ,該系統允許將生成的代碼的多個方面調整為所需的約定。
 
- JDK 1.6支持AutoValue和Lombok,但Immutables需要JDK 1.7。
結論
Lombok,AutoValue和Immutables有很多共同點,并且全部三個都可以用于從簡單的模板文件生成值類。 但是,它們各自提供不同的優點和功能,這可能會導致它們中的任何一個相對于其他開發者都具有不同的吸引力,具體取決于開發者的個人情況。
翻譯自: https://www.javacodegeeks.com/2016/06/lombok-autovalue-immutables.html
總結
以上是生活随笔為你收集整理的Lombok,自动值和不可变项的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 文件锁linux自动解锁(文件锁linu
- 下一篇: 服务器被ddos怎么办(服务器ddos怎
