@Cleanup注解
字如其名,就是lombok自动帮我做清理工作,当需要调用的资源默认有colse()方法,则直接调用,也可以手动指定清理方法; 需要注意的一点是该注解只适用于清理资源的方法是无参数的!(有参数的清理方法比如clean(xxx,…)无法利用该注解)
手动指定清理方法名称
@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);
注解使用例子
public class CleanupExample {
public static void main(String[] args) throws IOException {
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
}
}
@NonNull
Lombok帮我们生成参数是否为空的测试语句,免得我们自己判断
java源码
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
this.name = person.getName();
}
}
底层java class文件
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
if (person == null) {
throw new NullPointerException("person is marked @NonNull but is null");
}
this.name = person.getName();
}
}
@Getter、@Setter注解
除非明确指定AccessLevel,否则生成的getter / setter方法将是公共的,
还可以在类上放置@Getter和/或@Setter注释。
在这种情况下,就像使用注释注释该类中的所有**非静态字段一样**
最后还可以设置设置getter/setter方法的权限,甚至特定field不生成@getter/@setter方法
@Getter
@Setter
public class Address {
@Setter(AccessLevel.NONE)
private String city;
@Getter(AccessLevel.PRIVATE)
private String province;
private String name;
}
class文件,city没有setter方法,provice 的getter方法为private权限
public class Address {
private String city;
private String province;
private String name;
private String getProvince() {
return this.province;
}
public String getCity() {
return this.city;
}
public String getName() {
return this.name;
}
public void setProvince(String province) {
this.province = province;
}
public void setName(String name) {
this.name = name;
}
}
@EqualsAndHashCode
lombok建议我们当子类继承父类时,为子类生成注解 @EqualsAndHashCode时,可以通过设置callSuper=true属性避免出现错误(前提示父类也是lombok注解的),
还可以@EqualsAndHashCode.Include or @EqualsAndHashCode.Exclude 来制定哪些字段生成 equals() and hashcode()方法
@ToString
默认情况下打印非静态字段,如果要跳过某些字段,可以使用@ToString.Exclude注释这些字段。
或者,您可以使用@ToString(onlyExplicitlyIncluded = true)准确指定要使用的字段,然后使用@ ToString.Include标记要包含的每个字段。
@Getter
@Setter
@ToString(onlyExplicitlyIncluded=true)
public class Address {
@Setter(AccessLevel.NONE)
private String city;
@Getter(AccessLevel.PRIVATE)
private String province;
@ToString.Include
private String name;
}
---
public class Address {
private String city;
private String province;
private String name;
private String getProvince() {
return this.province;
}
public String getCity() {
return this.city;
}
public String getName() {
return this.name;
}
public void setProvince(String province) {
this.province = province;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "Address(name=" + this.getName() + ")";
}
}
toString方法甚至可以输出方法的结果
@Getter
@Setter
@ToString(onlyExplicitlyIncluded=true)
public class Address {
@Setter(AccessLevel.NONE)
private String city;
@Getter(AccessLevel.PRIVATE)
private String province;
@ToString.Include
private String name;
@ToString.Include
public String say() {
return "haha";
}
}
结果:
public String toString() {
return "Address(name=" + this.getName() + ", say=" + this.say() + ")";
}
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
@NoArgsConstructor将生成一个没有参数的构造函数。若final字段没有初始化,将导致编译器错误,除非使用@NoArgsConstructor(force = true),然后使用0 / false / null初始化所有final字段。对于具有约束的字段,例如@NonNull字段,不会生成任何检查,即代码里没有not null-check
@RequiredArgsConstructor为每个需要特殊处理的字段生成一个带有1个参数的构造函数。 所有未初始化的final字段都会获得一个参数,以及标记为@NonNull的任何字段(这些字段在声明它们时未初始化),所以说构造器的参数个数不定,取决于你的filed属性是否特殊。 对于标有@NonNull的字段,还会生成显式空检查。
@AllArgsConstructor 生成所有参数的构造器
@Accessors
@Accessors 主要用于控制生成的getter和setter
主要参数介绍
fluent boolean值,默认为false。此字段主要为控制生成的getter和setter方法前面是否带get/set
chain boolean值,默认false。如果设置为true,setter返回的是此对象,方便链式调用方法
prefix 设置前缀 例如:@Accessors(prefix = "abc") private String abcAge 当生成get/set方法时,会把此前缀去掉
当设置@Accessors(fluent=false,chain=true)
public String getName() {
return this.name;
}
public Address setProvince(String province) {
this.province = province;
return this;
}
public Address setName(String name) {
this.name = name;
return this;
}