1.使用范围
- 类:只能作用在类上
2.介绍
用于生成包含 final 和 @NonNull 注解的成员变量的构造方法
3.属性
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package lombok;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface RequiredArgsConstructor {
String staticName() default "";
RequiredArgsConstructor.AnyAnnotation[] onConstructor() default {};
AccessLevel access() default AccessLevel.PUBLIC;
/** @deprecated */
@Deprecated
@Retention(RetentionPolicy.SOURCE)
@Target({})
public @interface AnyAnnotation {
}
}
- staticName:使生成的构造方法是私有的
并且生成一个参数为 final 变量和 @NonNull 注解变量,返回类型为当前对象的静态方法,方法名为 staticName 值
- access:设置构造方法的访问修饰符,如果设置了 staticName,那么将设置静态工厂方法的访问修饰符
共有 PUBLIC、MODULE、PROTECTED、PACKAGE、PRIVATE、NONE
MODULE 是 Java 9 的新特性,NONE 表示不生成构造方法也不生成静态方法,即停用注解功能
- onConstructor:列出的所有注解都放在生成的构造方法上
JDK 7 之前的写法是 onConstructor = @__({@Deprecated}),而 JDK 8 之后的写法是 onConstructor_ = {@Deprecated}
4.实例
@RequiredArgsConstructor(staticName = "newInstance", access = AccessLevel.PROTECTED, onConstructor_ = {@Deprecated})
public class 程潇 {
private String name;
private final int age;
@NonNull
private String phone;
}
编译后:
public class 程潇 {
private String name;
private final int age;
@NonNull
private String phone;
@Deprecated
private 程潇(int age, @NonNull String phone) {
if (phone == null)
throw new NullPointerException("phone is marked non-null but is null");
this.age = age;
this.phone = phone;
}
protected static 程潇 newInstance(int age, @NonNull String phone) {
return new 程潇(age, phone);
}
}