lombok---讓代碼少的可憐.

也是亂逛論壇,無意間發現個好東西.挺實用的,就轉載下來了


另外idea安裝lombok請參考

https://www.cnblogs.com/aligege/p/7797642.html

demo文檔:

http://jnb.ociweb.com/jnb/jnbJan2010.html#intro

https://projectlombok.org/features/all



文章轉自:http://blog.csdn.net/sd6733531/article/details/7246529  文章名:發現神奇的lombok

項目主頁:http://projectlombok.org/index.html

源碼github主頁:https://github.com/rzwitserloot/lombok


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。

4.使用@Builder模式生成鏈式方法設置


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

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

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

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

  1. package lombok;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Arrays;  
  5. import java.util.List;  
  6.   
  7. //只可以指定of(白名單)和exclue(黑名單)之一。  
  8. @ToString(of={"name","both"},doNotUseGetters=true,includeFieldNames=true,callSuper=false)   //等於Eclipse的重構Generator特性。  
  9. @RequiredArgsConstructor(access=AccessLevel.PUBLIC,staticName="newTestByFactory")   //僅針對final系列強制初始化  
  10. @AllArgsConstructor(access=AccessLevel.PROTECTED)  //構造包含所有memeber參數的構造器,可指定access級別  
  11. @EqualsAndHashCode(exclude={"both"},doNotUseGetters=true//與ToString系列的規則基本相同  
  12. public class GenerateMemeber {  
  13.   
  14.     @Getter(value=AccessLevel.PROTECTED,lazy=trueprivate final int[] foo=expensiveCreate();//構造Getter,可以聲明爲lazy來獲取僅初始化一次的對象。注意該對象必須爲final類型  
  15.       
  16.     @Getter @Setter(AccessLevel.PROTECTED) private int both;//可以指定Setter爲特殊訪問限定符  
  17.       
  18.     //事實上在類載入階段即立即產生了  
  19.     private int[] expensiveCreate() {  
  20.         System.out.println("lazy create it!");  
  21.         int[] large=new int[1000];  
  22.         for(int i=0;i<large.length;i++) large[i]=i;  
  23.         return large;  
  24.     }  
  25.   
  26.     private Foo inner=new Foo();  
  27.       
  28.     @NonNull final String name;//標記爲NonNull的若在構造階段獲得null,則自動拋出異常  
  29.       
  30.     @ToString   //ToString不能深層次的處理。只是簡單調用object.toString() 故需要對自定義類型再次標註  
  31.     public static class Foo{  
  32.         String a="123";  
  33.         List<Integer> list=Arrays.asList(5,8,4,2,1);  
  34.     }  
  35.       
  36.     public static void main(String[] args) {  
  37.         //測試lazy  
  38.         GenerateMemeber test=new GenerateMemeber("tester");  
  39.         System.out.println(test.toString());  
  40.         System.out.println(test.getFoo());  
  41.         System.out.println(test.getFoo());  
  42.           
  43.         //測試類型推斷  
  44.         val playList=new ArrayList<String>();  
  45.         playList.add("1");  
  46.         playList.add("2");  
  47.         System.out.println(playList);  
  48.           
  49.         //測試工廠方法和非空  
  50.         GenerateMemeber test2=GenerateMemeber.newTestByFactory(null);  
  51.         System.out.println(test2);  
  52.           
  53.     }  
  54. }  


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

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


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