lombok 自动使用_Lombok,自动值和不可变项
lombok 自動(dòng)使用
我喜歡布蘭登(Brandon )在博客文章中比較Project Lombok , AutoValue和Immutables的建議 ,而這篇文章試圖做到這一點(diǎn)。 我已經(jīng)簡(jiǎn)要概述了Project Lombok , AutoValue和Immutables ,但是這篇文章有所不同,因?yàn)樗怀隽怂鼈冎g的異同。
Lombok, AutoValue和Immutables有很多相同之處,我嘗試用以下單個(gè)描述性句子總結(jié)這些相似之處:Lombok,AutoValue和Immutables使用注釋處理為值對(duì)象類所使用的常見操作生成樣板代碼。 本文的其余部分將更詳細(xì)地探討這些相似之處,并對(duì)比這三種方法。
代碼生成
Lombok,AutoValue和Immutables均旨在從簡(jiǎn)潔的代碼表示形式生成詳細(xì)的樣板代碼,這些代碼表示形式專注于高級(jí)業(yè)務(wù)邏輯,而將實(shí)現(xiàn)的低級(jí)細(xì)節(jié)留給代碼生成。 常見的對(duì)象方法,例如toString() , equals(Object)和hashCode()很重要,但需要正確編寫。 容易犯這些錯(cuò)誤,即使最初正確地編寫了這些錯(cuò)誤(包括通過IDE生成),但在對(duì)類產(chǎn)生影響的其他更改時(shí)也可以忽略它們。
價(jià)值對(duì)象
Lombok , AutoValue和Immutables均支持生成“ 值對(duì)象” 。 盡管AutoValue嚴(yán)格執(zhí)行值對(duì)象的生成,但如果指定了@Modifiable ,則Immutables允許生成的對(duì)象是可修改的,并且Lombok在其生成的類中使用@Set和@Data等批注支持多級(jí)修改。
超越價(jià)值對(duì)象
AutoValue專注于值對(duì)象的生成,并基于模板類中的抽象方法,支持字段,構(gòu)造函數(shù)/生成器,具體訪問器方法的生成以及常見方法equals(Object) , hashCode()和toString()的實(shí)現(xiàn)。
Immutables提供的功能類似于AutoValue提供的功能,并添加了使用@ Value.Modifiable生成可修改類的功能 。 不可變對(duì)象還提供其他功能 ,包括:
- 單例實(shí)例
- 預(yù)先計(jì)算的哈希碼
- 實(shí)例實(shí)習(xí)
- 可自定義的equals(Object),hashCode()和toString()實(shí)現(xiàn),包括從中排除字段
- 基本和高級(jí)序列化
Lombok提供了類似于具有@Value批注的AutoValue的值類生成功能,并提供了使用@Data批注生成可修改類的功能。 Lombok還提供其他功能 ,包括:
- 資源清理
- 記錄器字段生成
- 同步對(duì)象鎖
- 潛入檢查的異常
基于注釋處理
Lombok , AutoValue和Immutables都通過注釋處理從更簡(jiǎn)潔的模板代碼生成了更多冗長(zhǎng)的樣板代碼。 每個(gè)都包含一個(gè)在其JAR文件的META-INF/services區(qū)域javax.annotation.processing.Processor定義的javax.annotation.processing.Processor ,作為javac編譯器一部分的標(biāo)準(zhǔn)注釋處理器發(fā)現(xiàn)過程的一部分 。
并非所有注釋處理都相同
盡管Lombok,AutoValue和Immutables都通過javac進(jìn)行注釋處理 ,但是Lombok如何使用注釋處理的細(xì)節(jié)與AutoValue和Immutables的處理方法不同。 AutoValue和Immutables在更常規(guī)的意義上使用注釋處理,并從源生成源。 由AutoValue和Immutables生成的類源代碼的名稱與模板類不同,實(shí)際上是擴(kuò)展了模板類。 AutoValue和Immutables都讀取模板類,并在Java源代碼中生成一個(gè)具有自己名稱的全新類,該類具有所有生成的方法和字段。 這避免了與模板類的任何名稱沖突,并且使模板類源代碼和生成的類源代碼在同一IDE項(xiàng)目中的混合相當(dāng)容易,因?yàn)樗鼈儗?shí)際上是不同的類。
通過注釋處理生成AutoValue
通過注釋處理生成不可變對(duì)象
Lombok通過與AutoValue和Immutables不同的注釋處理來實(shí)現(xiàn)生成。 Lombok生成具有與“模板”源代碼相同的類名的已編譯.class文件,并將生成的方法添加到此已編譯版本中。 開發(fā)人員僅在查看.java文件時(shí)會(huì)看到簡(jiǎn)潔的模板代碼,而在查看.class文件時(shí)會(huì)看到源代碼中不存在的方法的編譯后的.class文件。 Lombok生成的不是另一個(gè)源文件,而是原始源的增強(qiáng)編譯版本。 有一個(gè)delombok選項(xiàng)可以與Lombok一起使用,以查看增強(qiáng)的.class文件背后生成的源代碼是什么樣子,但該項(xiàng)目的真正目的是從簡(jiǎn)潔的模板源直接轉(zhuǎn)換為增強(qiáng)的編譯類,而無需使用或使用中間增強(qiáng)功能。源文件。 delombok選項(xiàng)可用于查看生成的源的外觀,或者更重要的是,可以在將其與工具混淆以使源(簡(jiǎn)潔的模板.java文件)和生成的類(生成的類)不一致的情況下使用.class同名的.class文件)。
Lombok通過注釋處理生成
Lombok的注釋處理方法不像AutoValue和Immutables所采用的方法那樣傳統(tǒng),并且包括Lombok的創(chuàng)建者在內(nèi)的一些人將這種方法稱為“ hack” 。 Neildo的帖子Lombok – Trick Explained中很好地解釋了Lombok的“技巧”或“ hack”,并引用了內(nèi)容豐富的OpenJDK編譯概述 。
圍繞Lombok的方法引起爭(zhēng)議的主要原因密切相關(guān),并且是它使用了非標(biāo)準(zhǔn)的API,因此,很難與IDE和執(zhí)行自己的編譯的其他工具(例如javadoc )很好地集成。 由于AutoValue和Immutables自然會(huì)使用新的類名生成源代碼,因此任何傳統(tǒng)工具和IDE都可以將生成的源代碼與模板源代碼一起使用,而不會(huì)出現(xiàn)任何重大問題。
異同摘要
| 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 | (可選) 運(yùn)行時(shí)依賴項(xiàng) : Guava | 編譯時(shí)依賴(包括)的庫(kù) |
| 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 | 標(biāo)準(zhǔn)注釋處理器規(guī)范位置 |
| 增強(qiáng)的生成類替換模板源 | 生成的源擴(kuò)展了模板源 | Lombok僅顯示帶有“ delombok”選項(xiàng)的生成源 | |
| 指定delombok選項(xiàng) | 默認(rèn) | 默認(rèn) | 查看/控制生成的源代碼 |
| equals(Object) , hashCode() , toString() , 構(gòu)造 /生成器 , 訪問器 , 設(shè)置器 | equals(Object),hashCode(),toString(),構(gòu)造/生成器,訪問器 | equals(Object) , hashCode() , toString() , 構(gòu)造 /生成器 ,訪問器, 設(shè)置器 | |
| 允許使用字段級(jí)@Set進(jìn)行完全可變,但在需要不可變性時(shí)提供@Value | 加強(qiáng)嚴(yán)格的不變性 | “ 偏重于不變性 ”,但提供了類級(jí)別的@ Value.Modifiable | AutoValue的意見最多,Lombok的意見最少 |
| 資源清理 不可變或可變 偷偷地拋出檢查異常 對(duì)象同步鎖 記錄注釋 更多 … | 忠實(shí)于價(jià)值客體的概念 記錄的最佳做法 | 樣式定制 序列化 (包括JSON ) 預(yù)先計(jì)算的哈希碼 更多… |
選擇時(shí)的注意事項(xiàng)
Lombok,AutoValue和Immutables是類似的工具包,它們提供類似的好處,并且這三種方法中的任何一種都可以被廣泛的應(yīng)用程序成功使用。 但是,在選擇使用哪個(gè)工具箱時(shí),可以考慮它們之間的差異。
- Lombok生成具有與模板相同的包和類名稱的類,而AutoValue和Immutables生成擴(kuò)展模板類并具有自己的類名的類(但包相同)。
- 希望已編譯的.class文件具有與模板類完全相同的包和名稱的開發(fā)人員將首選Lombok。
- AutoValue是這三個(gè)工具包中最自以為是的,而Lombok則是最不自以為是的。
- 希望嚴(yán)格執(zhí)行“值對(duì)象”特征的開發(fā)人員可能更喜歡AutoValue。
- AutoValue和Immutables使用標(biāo)準(zhǔn)注釋處理,而Lombok使用非標(biāo)準(zhǔn)注釋處理方法。
- 希望避免非標(biāo)準(zhǔn)依賴關(guān)系的開發(fā)人員將傾向于使用AutoValue或Immutables。
- 這三個(gè)工具箱都支持某種程度的自定義,并且希望自定義所生成代碼的開發(fā)人員可能希望選擇允許他們以所需方式自定義所生成代碼的工具箱。
- Lombok提供了一種配置系統(tǒng) ,該系統(tǒng)允許將生成的代碼的多個(gè)方面調(diào)整為所需的約定。
- JDK 1.6支持AutoValue和Lombok,但I(xiàn)mmutables需要JDK 1.7。
結(jié)論
Lombok,AutoValue和Immutables有很多共同點(diǎn),并且全部三個(gè)都可以用來從簡(jiǎn)單的模板文件生成值類。 但是,它們各自提供不同的優(yōu)勢(shì)和功能,這可能會(huì)導(dǎo)致它們中的任何一個(gè)相對(duì)于其他開發(fā)者更具吸引力,這取決于開發(fā)者的個(gè)人情況。
翻譯自: https://www.javacodegeeks.com/2016/06/lombok-autovalue-immutables.html
lombok 自動(dòng)使用
總結(jié)
以上是生活随笔為你收集整理的lombok 自动使用_Lombok,自动值和不可变项的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 兄弟7470d怎么设置电脑接收传真(兄弟
- 下一篇: 华为p20如何连接电脑数据(华为p20如