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