背景
今天学习时突然发现一个@Slf4j这个注解,是来自lombok的
之前只了解到getter和setter,看到这个于是去学习了一下。
lombok简介
在官网上,lombok定了如下多种注解,
@Cleanup
@Getter, @Setter
@EqualsAndHashCode
@Constructor
@Data & @Value
@SneakyThrows
@Synchronize
@Getter(lazy=true)
@Log
等等,都是为了减少重复开发成本来用的
demo
比如针对getter和setter注解,官网的例子就是
用lombok
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
public class GetterSetterExample {
@Getter @Setter private int age = 10;
@Setter(AccessLevel.PROTECTED) private String name;
@Override public String toString() {
return String.format("%s (age: %d)", name, age);
}
}
效果等同于下面这段不用lombok
public class GetterSetterExample {
private int age = 10;
private String name;
@Override public String toString() {
return String.format("%s (age: %d)", name, age);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
protected void setName(String name) {
this.name = name;
}
}
争议
看了下lombok有争议的地方,主要在于他实现的原理上
http://jnb.ociweb.com/jnb/jnbJan2010.html#controversy
http://blog.enixjin.net/why-you-should-not-use-lombok/
http://blog.csdn.net/ghsau/article/details/52334762
主要在于他实现的原理(这里我没有深入了解),网上说法是用了
使用非公开的API,在知道在javac编译代码时
annotation processor的实例一定是JavacAnnotationProcessor(接口AnnotationProcessor的内部实现)
直接使用强制类型转换cast。再从JavacAnnotationProcessor的方法里面拿到抽象语法树(AST)做修改。
源码中比如AnnotationProcessorHider.java类就会去修改AST
个人理解
个人觉得适量用即可,比如@Log,@Getter,@Setter等即可
过多的引入,会影响代码的可读性。
refer
https://projectlombok.org/features/all 官网
http://himichaelchu.iteye.com/category/324280 使用demo集合
争议,原理介绍
http://jnb.ociweb.com/jnb/jnbJan2010.html#controversy
http://blog.enixjin.net/why-you-should-not-use-lombok/
http://blog.csdn.net/ghsau/article/details/52334762