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 }



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