Lombok—消除樣板代碼

Lombok提供了簡單的註解的形式來幫助我們消除一些必須有但顯得很臃腫的Java樣板代碼,特別是對於 POJO類。Lombok就是根據註解在編譯時爲我們生成對應註解的樣板代碼,對於大型工程來說,這可以使我們免於幹體力活的苦力,代碼也更加地清晰簡潔,清爽可讀。該項目在github上的地址爲:https://github.com/rzwitserloot/lombok 

Lombok的安裝

使用Lombok是需要安裝的,如果不安裝,IDE 則無法解析Lombok註解。http://projectlombok.org/download.html這裏提供了jar包的下載。官網上說可以通過雙擊jar包以Java程序運行該jar包來進行安裝,但經常是由於系統環境和配置的問題而無法成功。但我們還可以通過手動的方式來進行安裝。具體步驟如下:1.將lombok.jar複製到myeclipse.ini/eclipse.ini所在的文件夾目錄下;

2.打開eclipse.ini/myeclipse.ini,在文件的最後面插入以下兩行並保存:

-Xbootclasspath/a:lombok.jar

-javaagent:lombok.jar

3.重啓eclipse/myeclipse即可。

Lombok常用註解說明

@Data:註解在類上,提供類所有屬性的getter和setter方法,以及equals、hashCode、toString方法等;

@Setter:註解在屬性上,爲屬性提供setter方法;

@Getter:註解在屬性上,爲屬性提供getter方法;

如果@Getter和@Setter註解在類上,則相當於爲該類中所有的成員屬性加上了@Getter和@Setter註解。

@Log4j:註解在類上,爲類提供一個屬性名爲log的log4j日誌對象;

@NoArgsConstructor:註解在類上,爲類提供一個無參的構造方法;

@AllArgsConstructor:註解在類上,爲類提供一個包括所有屬性的構造方法;

@EqualsAndHashCode:註解在類上,爲類提供equals()方法和hashCode()方法;

@ToString:註解在類上,爲類提供toString()方法;

@Cleanup:註解在IO變量上,實現流的關閉。

Lombok使用示例

需要注意的是,在使用lombok註解的時候需要導入lombok.jar包到工程。

1.不使用lombok的寫法

 1
 2public class Person {
 3
 4    private String id;
 5    private String name;
 6    private String identity;
 7    private Logger log = Logger.getLogger(Person.class);
 8    
 9    public Person() {
10        
11    }

12    
13    public Person(String id, String name, String identity) {
14        this.id              = id;
15        this.name       = name;
16        this.identity  = identity;
17    }

18    
19    public String getId() {
20        return id;
21    }

22    
23    public String getName() {
24        return name;
25    }

26    
27    public String getIdentity() {
28        return identity;
29    }

30    
31    public void setId(String id) {
32        this.id = id;
33    }

34    
35    public void setName(String name) {
36        this.name = name;
37    }

38    
39    public void setIdentity(String identity) {
40        this.identity = identity;
41    }

42}

43
2.使用lombok的寫法
 1
 2@Data
 3@Log4j
 4@NoArgsConstructor
 5@AllArgsConstructor
 6public class Person {
 7
 8    private String id;
 9    private String name;
10  private String identity;
11    
12}

對於getter、setter、equals和hashCode、toString方法還可以在註解後面加上配置來指定方法的作用域或排除掉某些屬性,如下面的示例:

@Getter(AccessLevel.PROTECTED) private int size;

上面這句代碼則會在編譯時爲size屬性生成protected的getter方法。如果getter和setter方法需要有特殊的實現,則可以直接編碼實現,Lombok編譯時會檢查代碼而不會再生成該屬性已編碼實現的getter和setter方法

@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)

這裏,顏色屬性沒有被包括在toString方法的輸出中。

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

在上例中,當equals()hashCode()方法生成時,style屬性便不會被包括在內。

對於equals和hashCode、toString方法,如果需要調用父類的方法,則可以加上callSuper=true配置。如果需要排除掉多個屬性,則可以這樣寫:exclude={"address","city","state","zip"}。

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

上面的代碼塊不僅消除了try/catch/finally塊,而且還關閉了流。如果處理的對象使用一個別的方法而不是close()來釋放資源,則可以附加上要調用的方法名。比如,@Cleanup("dispose")。這裏需要特別注意的是,如果close方法拋出了異常需要捕獲,則需要編碼處理,而不能依賴該註解。

下面的代碼中,對於private final類型的變量,如果讀取該變量非常耗CPU時間或佔用內存,

@Getter(lazy=true)註解則只會在該變量第一次被通過getter方法訪問時才計算該變量的值並緩存起來,

從而提高性能。後面再次通過getter方法訪問該變量時將會返回緩存的值,而不會再次進行計算。

需要注意的是,lombok此時生成的getter方法是線程安全的。

01 import lombok.Getter;
02 
03 public class GetterLazyExample {
04   @Getter(lazy=trueprivate final double[] cached = expensive();
05   
06   private double[] expensive() {
07     double[] result = new double[1000000];
08     for (int i = 0; i < result.length; i++) {
09       result[i= Math.asin(i);
10     }
11     return result;
12   }
13 }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章