程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 以簡單的方式消除 Java 的冗長

以簡單的方式消除 Java 的冗長

編輯:關於JAVA

何為 Lombok?

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

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

初看上去,其中 可預見的冗余就已經非常多了。如果每個屬性都具有一個 getter 和 setter,並且通常如此 ,那麼又何必詳細說明呢?

讓我們來看看 Lombok。為了消除代碼行,Lombok 使用 注釋來標識類和 Java 代碼塊。在前述的那個 Java bean 示例中,所有的 getter、setter 以及其他三個方法都是在編譯時被暗示並包括進來的。

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

最直接的好處當然是代碼行的減少,這真的很棒。並且,如果有一個特定的 getter 或 setter 需要特別的注意,那麼您就不必為了找到這個特定的 getter 或 setter 而遍歷數十行代碼。代碼也會更為簡潔並且冗余也少了。

Lombok 還讓您得以簡化代 碼的其他部分 — 不僅僅是 Java bean。比如,還可以減少 try/catch/finally 塊內 以及同步方法內的冗余代碼。

現在,我們來看看在您自己的開發環境中如何能實現上 述目的。

安裝 Lombok

要進行安裝,本文假設您使用的是 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,那麼就需要關閉它並重啟。

使用 Lombok

現在,就可 以在 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 有助於代碼的整潔、效率的提高以及冗余的減少。為何不在您自己的環境內嘗試 一下呢?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved