以簡單的方式消除 Java 的冗長(Lombok)

複製的紅薯的,本身只是作一個歸檔,方便本身看。

------------------------------------------------------------------------------------ java

Lombok 是一種 Java Archive (JAR) 文件,可用來消除 Java 代碼的冗長。 瀏覽器

咱們看這樣一個例子,一個標準的 Java bean。一個典型的 Java bean 通常具備幾個屬性。每一個屬性具備一個 accessor 和 mutator(getter 和 setter)。一般還會有一個 toString() 方法、一個equals() 方法和一個 hashCode() 方法。 ui

初看上去,其中可預見的冗餘就已經很是多了。若是每一個屬性都具備一個 getter 和 setter,而且一般如此,那麼又何須詳細說明呢? 編碼

讓咱們來看看 Lombok。爲了消除代碼行,Lombok 使用註釋來標識類和 Java 代碼塊。在前述的那個 Java bean 示例中,全部的 getter、setter 以及其餘三個方法都是在編譯時被暗示幷包括進來的。 spa

並且更好的是若是您使用的是 Eclipse 或 IBM® WebSphere® Studio Application Developer(若是還沒用的話,建議最好使用),您就能夠將 Lombok 集成到 Java 項目並即刻得到開發時結果。換言之,Eclipse 編譯器能夠當即識別所暗指的 getters/setters,而其餘 Java 代碼則可引用這些方法。 操作系統

最直接的好處固然是代碼行的減小,這真的很棒。而且,若是有一個特定的 getter 或 setter 須要特別的注意,那麼您就沒必要爲了找到這個特定的 getter 或 setter 而遍歷數十行代碼。代碼也會更爲簡潔而且冗餘也少了。 設計

Lombok 還讓您得以簡化代碼的其餘部分 — 不只僅是 Java bean。好比,還能夠減小 try/catch/finally 塊內以及同步方法內的冗餘代碼。 code

-----------------------------------綠字部分講的是lombok的安裝 對象

如今,咱們來看看在您本身的開發環境中如何能實現上述目的。 ip

要進行安裝,本文假設您使用的是 Eclipse 或 WebSphere Studio Application Developer。若是不是,您仍可以使用 Lombok;可是不能享用開發時的種種益處。不過,您仍然能夠享用編譯時的益處。

首先,打開您的瀏覽器並將 URL 指向 http://projectlombok.org/。

在撰寫本文之時,用這個 URL 打開的頁面的右上角會出現一個很大的單詞。這個單詞是 「Download」。單擊該單詞並開始下載 lombok.jar。此文件無需解壓縮,而從其餘站點下載的文件中,99% 都須要解壓縮。

下載此文件後,須要執行這個 JAR 文件。在您的操做系統中打開一個提示符,進入到安裝了 lombok.jar 的那個目錄,並鍵入 java -jar lombok.jar。

以上假設在您的路徑內已經有 Java Runtime Environment (JRE)。若是沒有,須要添加它。若是要了解如何添加,能夠參考針對您的具體操做系統的相關文檔。

若是您使用的是 Microsoft® Windows®,那麼還能夠雙擊這個 lombok.jar 圖標。一樣地,您必須可以從您的圖形用戶界面(GUI)執行 JAR。

無論採起何種方式,應該最終都能看到一個 Lombok 安裝屏幕。該屏幕會提問 Eclipse 或 WebSphere Studio Application Developer 可執行文件位於何處。它的默認位置有多是正確的。但有時可能須要更改這個默認位置。

單擊 Install/Update,Lombok 會被迅速併入 Eclipse 開發環境。若是已經運行了 Eclipse,那麼就須要關閉它並重啓。

如今,就能夠在 Eclipse 或 WebSphere Studio Application Developer 內開始使用 Lombok 了。請參考清單 1 內的代碼。

清單 1. Java bean 的一個良好開端

public class Lure {
	private String name;
	private int size;
	private String color;
	private String style;
}

以上是一個簡單的 Java bean 的典型開始。從這裏,能夠爲每一個屬性添加 getters 和 setters。而後再添加一個 equals() 方法、一個 toString() 方法和一個 hashCode() 方法。

有了 Lombok,您無需本身完成上述操做。相反,您只需添加一個註釋:@Data。

沒錯,就這麼簡單。清單 2 中包括了 @Data。

清單 2. Java bean 的一個更好的開端

import lombok.Data
public @Data class Lure {
	private String name;
	private int size;
	private String color;
	private String style;
}

不過請記住,只有當 lombok.jar 位於您的構建路徑且 lombok.Data 被導入到這個 Java 類時,上述代碼纔會奏效。

若是在 Eclipse 或 WebSphere Studio Application Developer 內查看這個類的概要(一般位於屏幕上這個類的右側),就能看到這些方法會被自動添加到這個 Lure 類。

若不能當即看到這個概要,能夠單擊 Eclipse 內的 Window 菜單,而後選擇 Show View。 從所出現的彈出菜單中,選擇 Outline,它應該出如今屏幕的右側。強制顯示類的概要的熱鍵組合是Alt+Shift+Q, 而後是 O

若是您編寫了另外一個類來實例化 Lure,您將能馬上擁有對 Lure 所暗指的方法(好比getName() 或 setSize())的訪問。您還能擁有對 equals()、hashCode() 和 toString()的訪問。很棒,對吧?

若是您使用的不是 Eclipse 或 WebSphere Studio Application Developer,那麼所暗指的這些方法添加只有在實際編譯這些代碼時才能被承認。因此雖然在沒有 Eclipse 或 WebSphere Studio Application Developer 時仍可使用 Lombok,但 Lombok 最初的設計目的就是與 Eclipse 或 WebSphere Studio Application Developer 相集成。

在生成 getter/setter 方法時,Lombok 聽從傳統的標準。全部這些方法名都以 get 或 set 開頭而且屬性名都是大寫的。固然,若是屬性是一個 Boolean,狀況例外。在這種狀況下,getter 以is 開始,而非 get。這是 Java bean 的一種標準實踐。

如今,假設有一個 Java bean 對您的一個 getter 具備特殊要求。在清單 2 的例子中,getStyle()可能返回顏色和大小的組合。在這種狀況下,能夠按本身的意願編寫 getStyle() 方法的代碼。Lombok 檢查您的代碼而且不會基於這個屬性建立其本身的 getStyle 版本。

又假設,您有一個 getter 方法不想公開。爲此,Lombok 讓您能夠輸入一個附加參數。清單 3 給出了一個定製的修飾符(modifier)。

清單 3. 一個定製的修飾符

private String name;
	@Getter(AccessLevel.PROTECTED) private int size;
	private String color;
	private String style;

在本例中,getSize() 方法將不會被公開。它具備一個受保護的修飾符,因此它只對派生子類可用而且在 Lure 類自己的內部。

您可能並不老是想接受 Lombok 爲您提供的其餘默認值。好比,toString() 方法會列出類名以及全部的屬性名和值,中間以逗號分割。這個列表出如今類名的旁邊。

好比,假設在記錄這個 Lure 類時,您並不關心顏色。爲了更改 toString() 的默認設置,須要使用 ToString 註釋。

清單 4. 修改 toString()

@ToString(exclude="color")
public @Data class Lure {
	private String name;
	private int size;
	private String color;
	private String style;
}

若輸出一個實例化了的 Lure 類,它應該看上去相似於:

Lure(name=Wishy-Washy, size=1, style=trolling)

注意到顏色沒有被包括?這是由於您以前用註釋告訴過 Lombok 不包括顏色。

您還能夠修改 equals() 和 hashCode() 方法該如何被處理。清單 5 很直白,不須要過多解釋。

清單 5. 修改 hashCode()

@EqualsAndHashCode(exclude="style")
public @Data class Lure {
	private String name;
	private int size;
	private String color;
	private String style;
}

在本例中,當 equals() 和 hashCode() 方法生成時,style 屬性並無被包括。

您是否是也一直很是痛恨編寫 try/catch/finally 塊呢?我是這樣的。幸運的是,有了 Lombok,您無需這麼作了。這也是 Lombok 消除 Java 冗餘的另外一種方式。爲了消除 try/catch/finally 塊的冗餘,只需使用 @Cleanup 註釋。參見清單 6。

清單 6. 使用 @Cleanup 註釋

public static void main(String[] args) throws IOException {
	@Cleanup InputStream in = new FileInputStream(args[0]);
	@Cleanup OutputStream out = new FileOutputStream(args[1]);
	//write file code goes here
}

上述代碼較咱們一般在標準 Java 代碼內看到的整潔了不少。請注意您仍是須要拋出由被調用代碼捕獲的異常(在本例中,爲 IOException)。

清單 6 中的這個代碼塊不只消除了 try/catch/finally 塊,並且還關閉了開放流。若是您處理的對象使用一個方法而不是 close() 來釋放資源,那麼就須要用一個帶附加說明的註釋調用該方法。好比,@Cleanup("relinquish")。

Lombok 還能夠減小同步方法所需的代碼的冗餘。很天然,這是用 @Synchronized 方法實現的。

清單 7. 使用 @Synchronized 註釋

@Synchronized
private int foo() {
	//some magic done here
	return 1;
}

在本例中,Lombok 會自動建立一個名爲 $lock 的實例對象,並會針對該對象同步方法 foo()。

若是用 @Synchronized 註釋的這個方法是靜態的,那麼 Lombok 就會建立一個名爲 $LOCK 的類對象,並會針對該對象同步這個方法。

您還能夠指定一個對象用以經過一個附加參數進行顯式的鎖定。好比,@Synchronized("myObject")會針對對象 myObject 同步這個方法。在這種狀況下,必須顯式地定義它。

使用 Lombok,能夠實現全部應用程序開發人員都不遺餘力實現的一個目標:消除冗餘。

您還可讓您的代碼可讀性更好。在 Java bean 內尋找 「特殊」(即不遵循典型的標準)的具備大量屬性的 getter 和 setter 方法將更爲簡便。這是由於只有這些特殊的 getter/setter 方法是須要被實際編碼的。

Lombok 有助於代碼的整潔、效率的提升以及冗餘的減小。爲什麼不在您本身的環境內嘗試一下呢?

相關文章
相關標籤/搜索