發現神奇的lombok

sd6733531發表於2012-02-09

專案主頁:http://projectlombok.org/index.html

原始碼github主頁:https://github.com/rzwitserloot/lombok/tree/master/src


lombok這個名字很大名鼎鼎的j2ee外掛lomboz十分相像。lombok貌似也是一個外掛,但是它的功能強大得有些讓人難以置信。

我們先來看看為什麼需要lombok?

lombok是一種程式碼生成器,它可以為我們生成如下一些程式碼:

1.封裝屬性的Getter Setter程式碼

2.參構造器

3.靜態工廠

4.預設的toString()和equals()


另外lombok還製造了非常有趣的一些語法糖,如下舉了一些例子:

1.使用val做泛型自動推斷(用val估計是考慮到jdk以後版本會使用var關鍵字)

2.使用@CleanUp自動關閉流

3.使用@SneakyThrows來包裝Exception為RuntimeException。


這樣看下來,lombok的目標已經顯而易見了。它和jquery一樣,目標是讓程式設計師寫更少的程式碼,以及改進一些原始語法中不盡人意的地方。

lombok能做到這一點。既不是用annotations process,也不是用反射。而是直接黑到了編譯過程。

而我們如果想要享受lombok所帶來的神器效果,需要做的僅僅只是將lombok像普通jar包一樣匯入工程即可。

是否很奇妙呢?趕緊試試吧,下面是我貼出的一段例項程式碼:

package lombok;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

//只可以指定of(白名單)和exclue(黑名單)之一。
@ToString(of={"name","both"},doNotUseGetters=true,includeFieldNames=true,callSuper=false)	//等於Eclipse的重構Generator特性。
@RequiredArgsConstructor(access=AccessLevel.PUBLIC,staticName="newTestByFactory")	//僅針對final系列強制初始化
@AllArgsConstructor(access=AccessLevel.PROTECTED)  //構造包含所有memeber引數的構造器,可指定access級別
@EqualsAndHashCode(exclude={"both"},doNotUseGetters=true) //與ToString系列的規則基本相同
public class GenerateMemeber {

	@Getter(value=AccessLevel.PROTECTED,lazy=true) private final int[] foo=expensiveCreate();//構造Getter,可以宣告為lazy來獲取僅初始化一次的物件。注意該物件必須為final型別
	
	@Getter @Setter(AccessLevel.PROTECTED) private int both;//可以指定Setter為特殊訪問限定符
	
	//事實上在類載入階段即立即產生了
	private int[] expensiveCreate() {
		System.out.println("lazy create it!");
		int[] large=new int[1000];
		for(int i=0;i<large.length;i++) large[i]=i;
		return large;
	}

	private Foo inner=new Foo();
	
	@NonNull final String name;//標記為NonNull的若在構造階段獲得null,則自動丟擲異常
	
	@ToString	//ToString不能深層次的處理。只是簡單呼叫object.toString() 故需要對自定義型別再次標註
	public static class Foo{
		String a="123";
		List<Integer> list=Arrays.asList(5,8,4,2,1);
	}
	
	public static void main(String[] args) {
		//測試lazy
		GenerateMemeber test=new GenerateMemeber("tester");
		System.out.println(test.toString());
		System.out.println(test.getFoo());
		System.out.println(test.getFoo());
		
		//測試型別推斷
		val playList=new ArrayList<String>();
		playList.add("1");
		playList.add("2");
		System.out.println(playList);
		
		//測試工廠方法和非空
		GenerateMemeber test2=GenerateMemeber.newTestByFactory(null);
		System.out.println(test2);
		
	}
}


    事後本人想嘗試在android中使用lombok。可惜並沒有成功,lombok中針對Constructor指定的AccessLevel不知為何沒有效果。而lombok1.3MB的龐大體積對於android專案來說又是體積過大。eclipse上提示編譯成功並生成apk包後,卻無法最終安裝。嘗試用winrar也無法開啟apk包,看來lombok做的編譯手腳已經影響到打包了。

   雖然在移動平臺上lombok使用失敗了。但是在伺服器和桌面應用端,lombok真是個十分火辣迷人的利器。

相關文章