先抛出一个实践认证结论,优先级关系
@AllArgsConstructor,@NoArgsConstructor 》@Builder》@Data,@Getter,@Setter
1.@Getter 生成get方法、无参函数
2.@Setter 生成set方法、无参函数
3.@Data 生成get、set方法,无参函数,hashCode,equals,canEqual,toString方法
4.@Builder 生成全参函数、builder静态方法及XXXBuilder静态内置类
5.@AllArgsConstructor 全参函数
6.@NoArgsConstructor 无参函数
测试a.
不引入@AllArgsConstructor,@NoArgsConstructor两个注解时,对@Builder,@Data,@Getter,@Setter两两组合反编译发现
只要引入了@Builder,无参函数就没了被全参函数代替
测试b.
不引入@Builder注解时,对@AllArgsConstructor,@NoArgsConstructor,@Data,@Getter,@Setter两两组合反编译发现
构造函数以@AllArgsConstructor,@NoArgsConstructor为准,@Data,@Getter,@Setter的无参函数优先级低
测试c.
在引入@Builder和@NoArgsConstructor时编译报错,因为@Builder必须依赖全参函数,而@NoArgsConstructor优先级高使得
类没有全参函数故编译报错,此时加入@AllArgsConstructor就编译通过了。
增:继承关系下@Data @Builder需要作出的调整
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class Student extends Teacher {
private String name;
@Builder
Student(String a,String b){
super(b);
this.name = b;
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
private String classname;
}
注意父类不能使用@Builder,再增加全参函数供子类调用