lombok---让代码少的可怜.

也是乱逛论坛,无意间发现个好东西.挺实用的,就转载下来了

转自:http://blog.csdn.net/sd6733531/article/details/7246529  文章名:发现神奇的lombok


项目主页: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包一样导入工程即可。

是否很奇妙呢?赶紧试试吧,下面是我贴出的一段实例代码:

[java]  view plain copy
  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真是个十分火辣迷人的利器。


你可能感兴趣的:(annotation,J2EE)