Lombok,一种编译时Java注释预处理器,可最大程度地减少代码大小
在本文中,我們將看到如何在常規(guī)Java代碼中使用lombok來(lái)最小化代碼長(zhǎng)度和冗余。
什么是Lombok?
Lombok,一個(gè)編譯時(shí)注釋預(yù)處理器,有助于在編譯時(shí)注入一些代碼。 在詳細(xì)介紹之前,我要求您應(yīng)該從他們的網(wǎng)站上觀看視頻。 我不會(huì)像這樣進(jìn)行現(xiàn)場(chǎng)演示,但是我將展示如何在項(xiàng)目?jī)?nèi)部使用它(包括Maven生命周期)。
讓我們從基本的了解開(kāi)始。 如我所知,lombok是一個(gè)編譯時(shí)注釋預(yù)處理器。 那是什么意思
->它將在編譯時(shí)起作用(我們可以在編寫(xiě)代碼時(shí)看到效果)
->在編譯過(guò)程中(使用javac命令執(zhí)行)我們需要類路徑中的依賴項(xiàng)
->我們需要插件支持才能在編碼時(shí)看到IDE的效果。(因?yàn)镮DE在編碼/保存過(guò)程中會(huì)進(jìn)行編譯)
Lombok有幾個(gè)實(shí)用程序/功能。 我們將介紹到目前為止我使用過(guò)的主要項(xiàng)目。
注意:要了解批注,您可能會(huì)看到我的這篇文章。
安裝方式:
Eclipse:從此鏈接下載并安裝(您需要顯示eclipse安裝目錄)
(我已經(jīng)檢查了STS / eclipse版本:3.7.3.RELEASE)
Intellij IDEA:只需安裝lombok插件。 (文件->設(shè)置->插件->搜索/瀏覽以查看,然后安裝)
或: 插件鏈接
現(xiàn)在:基于IDE行為,您可能需要啟用注釋預(yù)處理器才能使插件正常工作。 (通常現(xiàn)代IDE具有此默認(rèn)設(shè)置)
從Eclipse:
IntelliJ IDEA:
項(xiàng)目設(shè)置:
我將使用Maven(您可以以相同的方式使用gradle)。 我的Maven版本是3.3.9。
步驟1:在pom.xml中,添加依賴項(xiàng)
dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.8</version></dependency> </dependencies>您可能會(huì)從Maven Central獲得更新的版本。
步驟2:如我們所見(jiàn),lombok是編譯時(shí)預(yù)處理器,因此,我們需要編譯器。 因此,在build-> plugins-> plugin內(nèi)添加maven編譯器插件
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><compilerVersion>1.8</compilerVersion><source>1.8</source><target>1.8</target></configuration> </plugin>可以看到,我已將源和目標(biāo)版本定義為1.8。
步驟3:現(xiàn)在我們需要添加lombok插件以在項(xiàng)目編譯期間工作。 為此,我們需要在插件管理中輸入內(nèi)容,并在構(gòu)建部分添加帶有參數(shù)的插件。
<pluginManagement><plugins><plugin><groupId>org.projectlombok</groupId><artifactId>lombok-maven-plugin</artifactId><version>1.16.8.0</version></plugin></plugins> </pluginManagement>用參數(shù)添加插件
<plugin><groupId>org.projectlombok</groupId><artifactId>lombok-maven-plugin</artifactId><version>1.16.8.0</version><configuration><encoding>UTF-8</encoding></configuration><executions><execution><phase>generate-sources</phase><goals><goal>testDelombok</goal><goal>delombok</goal></goals></execution></executions> </plugin>這里的空間注釋:
1.編碼是必要的
2.您可以看到我使用了2個(gè)目標(biāo) ,這些是為測(cè)試和源范圍定義為lombok定義的空間目標(biāo)。 我同時(shí)使用兩者,因?yàn)槲业臏y(cè)試代碼也需要lombok。
因此,我的構(gòu)建部分就是這個(gè)。
<build><pluginManagement><plugins><plugin><groupId>org.projectlombok</groupId><artifactId>lombok-maven-plugin</artifactId><version>1.16.8.0</version></plugin></plugins></pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><compilerVersion>1.8</compilerVersion><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.projectlombok</groupId><artifactId>lombok-maven-plugin</artifactId><version>1.16.8.0</version><configuration><encoding>UTF-8</encoding></configuration><executions><execution><phase>generate-sources</phase><goals><goal>testDelombok</goal><goal>delombok</goal></goals></execution></executions></plugin></plugins> </build>并且,對(duì)于日志記錄,我們需要具有依賴性。 我將添加所有類型的日志示例。 所以將所有這些加在一起
<!--Logging external dependencies--><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version> </dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version> </dependency> <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version> </dependency> <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-ext</artifactId><version>1.7.21</version> </dependency> <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.5</version> </dependency>因此,最后我的POM的構(gòu)建部分如下所示 。
現(xiàn)在,該看一下每個(gè)功能的用法了:
注意:對(duì)于eclipse和IntelliJ,我都使用“大綱視圖”來(lái)查看效果。 要啟用大綱:
Eclipse:窗口->顯示視圖->大綱
IntelliJ:查看->工具按鈕,將進(jìn)行結(jié)構(gòu)化。
@Getter @Setter:它使帶有變量的getter setter變得麻木。 它還支持訪問(wèn)級(jí)別參數(shù),以定義getter和setter的范圍。
參數(shù):采用枚舉參數(shù)AccessLevel
PUBLIC =可公開(kāi)訪問(wèn)
MODULE,PACKAGE =與默認(rèn)值相同(不使用任何修飾符) 受保護(hù)=與受保護(hù)相同 私人=與私人相同 NONE =不會(huì)執(zhí)行
在課堂上:
覆蓋類級(jí)別的getter: @ToString:這是toString()的實(shí)現(xiàn),我們只能用于類級(jí)別。
參數(shù):
includeFieldNames():布爾類型=>定義所有字段包含
callSuper():布爾類型=>調(diào)用super
doNotUseGetters():布爾類型=>避免使用字段的獲取器。 exclude():字段名稱的字符串?dāng)?shù)組=>定義字段排除 of():字段名稱的字符串?dāng)?shù)組=>定義要添加的字段(顯式)
@Data:它是多個(gè)注釋的組合。
哪里:我們可以在類/類型之前使用
參數(shù):
注意:數(shù)據(jù)包括
1. @Getter,
2. @Setter。 3. @RequiredArgsConstructor 4. @Tostring 5. @EqualsAndHashCode
范例:
蝕:
IntelliJ:
@Value:這只是@Data的不可變值類型。
參數(shù):staticConstructor條目將默認(rèn)構(gòu)造函數(shù)設(shè)為私有
@Builder:向您的班級(jí)添加默認(rèn)的構(gòu)建器類。 它只是一個(gè)構(gòu)建器(如構(gòu)建器模式,帶有參數(shù),請(qǐng)參見(jiàn)圖像中的示例)
@Singular:用于通知集合(僅支持guava和Java util)。 它包括2種加法器方法,一次添加,全部添加。
val:這使局部最終變量(內(nèi)部方法)
(緊接在this()或super()之后)
用途:
1.像var(js / c#)一樣使用,它將作為最終版本
2.在foreach循環(huán)中。
public class ValExample {val items;public void aMethod() {val store = new Hashtable<String, String>();store.put("one", new String("Shantonu"));val func = store.get("one");System.out.println(func.toLowerCase());store.put("two", "Andrii");store.put("three", "Oleks");for(val v: store.entrySet()){System.out.println("KEY =" +v.getKey()+", VAL = "+ v.getValue());}} }
@NotNull:這將對(duì)變量添加null檢查,并引發(fā)null指針異常。
使用范圍:方法,參數(shù),局部變量
無(wú)需檢查
與@NotNull
@EqualsAndHashCode:它簡(jiǎn)單地將equals(Object other)和hashCode()添加到類中。 (因此它是類級(jí)別的注釋)。
它支持參數(shù)以自定義那些equals和哈希碼方法。 所有參數(shù)均與@ToString相同。
@Cleanup:這是清理資源的簡(jiǎn)單方法。 實(shí)際上,它確保資源try()方法將在try的finally塊中調(diào)用。
僅局部變量:
調(diào)用資源的關(guān)閉方法。 如果您有另一個(gè)方法名稱,則需要調(diào)用value = thatMehtodName(例如exit)
您可以從這里看到一個(gè)簡(jiǎn)單的示例。 無(wú)需嘗試捕獲。
public class CleanupEx {public static void main(String[] args) throws IOException {String pom = System.getProperty("user.dir") + "/pom.xml";String io = System.getProperty("user.dir") + "/logs/io.txt";@Cleanup InputStream in = new FileInputStream(pom);@Cleanup OutputStream out = new FileOutputStream(io);int reading;char c;while ((reading=in.read())!=-1){c=(char)reading;out.write(c);}out.flush();} }注意:我認(rèn)為,當(dāng)您不關(guān)心管理資源時(shí),最好使用此功能。 如果您想按邏輯使用資源,最好避免這種情況。 例如,多線程資源的用法。
使用lombok記錄:
@log:這是最好的可用功能之一。 此圖顯示了要收集的所有記錄器。 我在github中的示例將顯示詳細(xì)信息。
我們需要在上課之前設(shè)置日志,僅此而已。 它會(huì)提供一個(gè)靜態(tài)變量日志,我們可以根據(jù)使用的日志類型來(lái)使用它。
Parameter:它將主題作為參數(shù),默認(rèn)情況下是類名。 我們可以設(shè)置日志主題。
注意:對(duì)于不同的日志實(shí)現(xiàn),我們需要不同類型的配置。 Lombok不提供任何配置幫助,僅注入代碼。 因此,我們需要添加取決于我添加的日志類型。
我在github中的示例包含所有6種日志配置類型。 仔細(xì)查看pom文件,以了解依賴關(guān)系以及配置文件的資源。
Lombok示例github鏈接 :https://github.com/sarkershantonu/practice-projects/tree/master/lombok-examples
注意:由于沒(méi)有測(cè)試范圍,我跳過(guò)了更多常規(guī)功能和實(shí)驗(yàn)功能(在空間上為@Synchronized)。 我將在github存儲(chǔ)庫(kù)中一一添加其他內(nèi)容,并在此處添加參考注釋。
翻譯自: https://www.javacodegeeks.com/2016/06/lombok-compile-time-java-annotation-preprocessor-minimize-code-size.html
總結(jié)
以上是生活随笔為你收集整理的Lombok,一种编译时Java注释预处理器,可最大程度地减少代码大小的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 158是什么意思 158有哪些含义
- 下一篇: javafx2_JavaFX 2 Gam