Lombok入门知识,请戳《Lombok-入门篇》
- @Getter
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Getter {
lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
AnyAnnotation[] onMethod() default {};
boolean lazy() default false;
@Deprecated
@Retention(RetentionPolicy.SOURCE)
@Target({})
@interface AnyAnnotation {}
}
该注解可以标注在字段或类上。标注在字段上,将会给该字段构建标准的getter方法,比如字段为name,则方法名为getName,方法返回值与字段的类型对应。标注在类上,将会对类中的所有非静态字段构建getter方法。
属性解释:
(1)value
设置生成的getter方法的访问修饰符,默认为public。AccessLevel的可选值有PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE,NONE分别对应访问权限为public、module(java9)、protected、default、private。NONE表示不生成getter方法,即停用注解功能。
比如,将getter方法设置成private:
// getter方法访问修饰符为private
@Getter(AccessLevel.PRIVATE)
public class User {
private String name;
}
编译后:
public class User {
private String name;
public User() {
}
// 方法是private
private String getName() {
return this.name;
}
}
(2)lazy
默认为false,当配置lazy=true时,@Getter注解只能标注在字段上,且该字段必须是private和final修饰的,也就是无法修改了。lazy的含义是只有调用get方法的时候,才会对属性赋值。
源码:
public class User {
@Getter(value = AccessLevel.PUBLIC, lazy = true)
private final String name = "hello";
}
编译后:
import java.util.concurrent.atomic.AtomicReference;
public class User {
private final AtomicReference<Object> name = new AtomicReference();
public User() {
}
public String getName() {
Object value = this.name.get();
if (value == null) {
synchronized(this.name) {
value = this.name.get();
if (value == null) {
String actualValue = "hello";
value = "hello" == null ? this.name : "hello";
this.name.set(value);
}
}
}
return (String)((String)(value == this.name ? null : value));
}
}
(3)onMethod
构建在方法上添加注解,是一个还处于实验中的功能,暂不讨论。
使用规则:
(1)标注在字段上
源码:
public class User {
@Getter
private String name;
@Getter
private static int age;
}
编译后:
public class User {
private String name;
private static int age;
public User() {
}
public String getName() {
return this.name;
}
public static int getAge() {
return age;
}
}
当在字段上使用时,是不区分静态和非静态字段的,均可以构建getter方法。
(2)标注在类上
源码:
@Getter
public class User {
private String name;
private static int age;
}
编译后:
public class User {
private String name;
private static int age;
public User() {
}
public String getName() {
return this.name;
}
}
当在类上使用时,不会对静态字段构建getter方法。
(3)已经自定义实现了getXx方法,是否会覆盖:
源码:
@Getter
public class User {
private String name;
public int getName() {
return name.hashCode();
}
}
编译后:
public class User {
private String name;
public User() {
}
public int getName() {
return this.name.hashCode();
}
}
Lombok不会覆盖已经显示定义的同名方法,虽然自定义的getName方法不是标准的getter方法,返回值不是name的String类型。此条规则也适应于其他注解。
- @Setter
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Setter {
lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
AnyAnnotation[] onMethod() default {};
AnyAnnotation[] onParam() default {};
@Deprecated
@Retention(RetentionPolicy.SOURCE)
@Target({})
@interface AnyAnnotation {}
}
该注解可以标注在字段与类上。标注在字段上,将会给该字段构建标准的setter方法,比如字段为name,则方法名为setName或isName,方法返回值与字段的类型对应。标注在类上,将会对类中的所有非静态字段、非final字段构建setter方法。
属性解释:
(1)value与onMethod作用与@Getter相同。
(2)onParam
对setter方法的参数添加注解,也是一个处于实验中的功能。
使用规则:
(1)与@Getter的区别是,@Setter注解不会对final修饰的属性构建方法,而@Getter可以。
源码:
@Setter
@Getter
public class User {
private final String name = "hello";
}
编译后:
public class User {
private final String name = "hello";
public User() {
}
public String getName()