背景
今天學習時突然發(fā)現(xiàn)一個@Slf4j這個注解,是來自lombok的
之前只了解到getter和setter,看到這個于是去學習了一下。
lombok簡介
在官網(wǎng)上,lombok定了如下多種注解,
@Cleanup
@Getter, @Setter
@EqualsAndHashCode
@Constructor
@Data & @Value
@SneakyThrows
@Synchronize
@Getter(lazy=true)
@Log
等等,都是為了減少重復開發(fā)成本來用的
demo
比如針對getter和setter注解,官網(wǎng)的例子就是
用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有爭議的地方,主要在于他實現(xiàn)的原理上
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
主要在于他實現(xiàn)的原理(這里我沒有深入了解),網(wǎng)上說法是用了
使用非公開的API,在知道在javac編譯代碼時
annotation processor的實例一定是JavacAnnotationProcessor(接口AnnotationProcessor的內(nèi)部實現(xiàn))
直接使用強制類型轉(zhuǎn)換cast。再從JavacAnnotationProcessor的方法里面拿到抽象語法樹(AST)做修改。
源碼中比如AnnotationProcessorHider.java類就會去修改AST
個人理解
個人覺得適量用即可,比如@Log,@Getter,@Setter等即可
過多的引入,會影響代碼的可讀性。
refer
https://projectlombok.org/features/all 官網(wǎng)
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