本篇文章会讲到:@Setter,@Getter、@Getter(lazy=true)、@ToString、@EqualsAndHashCode、@NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor、@Data 注解使用
1、@Setter,@Getter使用
注解在属性上,为属性提供 set()、 get() 方法 。
注解在类上,为类所有的属性提供 set()、 get() 方法。
所有非静态成员变量才会提供 set()、 get() 方法。
import lombok.Getter; import lombok.Setter;
@Setter @Getter public class Example {
private String name; public String getName() { return name; }
}
编译后:
public class Example {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、@Getter(lazy=true)
标注用于生成一个 lazy 版的 getter,它会在第一次调用这个 getter 时计算一次值,然后从那里开始缓存它。如果计算该值需要大量 CPU,或者该值占用大内存,这可能很有用。Lombok 会自动去管理线程安全的问题,所以不会存在重复赋值的问题。
要使用此功能,需要创建一个 private final 变量,并且使用运行成本高的表达式对其进行初始化,同时使用 @Getter(lazy=true) 注解进行标注。
import lombok.Getter;
public class GetterLazyExample { @Getter(lazy=true) private final double[] cached = expensive();
private double[] expensive() { double[] result = new double[1000000]; for (int i = 0; i < result.length; i++) { result[i] = Math.asin(i); } return result; } }
编译后:
public class GetterLazyExample {
private final java.util.concurrent.AtomicReference<java.lang.Object> cached = new java.util.concurrent.AtomicReference<java.lang.Object>();
public double[] getCached() {
java.lang.Object value = this.cached.get();
if (value == null) {
synchronized(this.cached) {
value = this.cached.get();
if (value == null) {
final double[] actualValue = expensive();
value = actualValue == null ? this.cached : actualValue;
this.cached.set(value);
}
}
}
return (double[])(value == this.cached ? null : value);
}
private double[] expensive() {
double[] result = new double[1000000];
for (int i = 0; i < result.length; i++) {
result[i] = Math.asin(i);
}
return result;
}
}
3、@ToString使用
该注解的作用是为类自动生成 toString() 方法。
默认情况下,它会按顺序(以逗号分隔)打印这个类名称以及每个字段。
可以这样设置不包含哪些字段:@ToString(exclude = "id") 或者 @ToString(exclude = {"id","name"})
import lombok.ToString;
@ToString @Getter public class Example {
private String name; private String age;
}
编译后:
public class Example {
private String name;
private String age;
public String getName() {
return name;
}
public String getAge() {
return age;
}
@Override public String toString() {
return "Example(name" + this.getName() + ", age=" + this.getAge() + ")";
}
}
4、@EqualsAndHashCode使用
- @EqualsAndHashCode官方文档地址
- 为对象字段自动生成 hashCode() 和 equals() 实现。
- 默认情况下,它将使用所有非静态,非 transient 字段。
- 可以通过在可选的 exclude 参数中来排除更多字段。
- 也可以通过在 parameter 参数中命名它们来准确指定希望使用哪些字段。
5、@NoArgsConstructor 使用
注解在类上,为类提供一个无参的构造方法。
当类中有 final 字段没有被初始化时,编译器会报错,此时可用 @NoArgsConstructor(force = true),然后就会为没有初始化的 final 字段设置默认值 0 / false / null。
对于具有约束的字段(例如 @NonNull 字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。
import lombok.NoArgsConstructor;
@NoArgsConstructor public class Example {
private String name; private String age;
}
编译后:
public class Example {
private String name;
private String age;
public Example() {
}
}
6、@AllArgsConstructor使用
注解在类上,为类提供一个全参的构造方法。
默认生成的方法是 public 的,如果要修改方法修饰符可以设置 AccessLevel 的值。例如:@Getter(access = AccessLevel.PROTECTED)。
import lombok.AllArgsConstructor;
@AllArgsConstructor public class Example {
private String name; private String age;
}
编译后:
public class Example {
private String name;
private String age;
public Example(String name, String age) {
this.name = name;
this.age = age;
}
}
7、@RequiredArgsConstructor使用
注解在类上,会生成构造方法(可能带参数也可能不带参数)。如果带参数,这参数只能是以 final 修饰的未经初始化的字段或者是以 @NonNull 注解的未经初始化的字段。
该注解还可以用 @RequiredArgsConstructor(staticName="methodName") 的形式生成一个指定名称的静态方法,返回一个调用相应的构造方法产生的对象。
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor public class Example {
private final String name; private String age;
}
编译后:
public class Example {
private final String name;
private String age;
public Example(String name) {
this.name = name;
}
}
8、@Data使用
@Data 是一个复合注解,注解在类上,自动生成默认的无参构造函数、所有属性的 getter、所有非 final 属性的 setter 方法,并重写 toString、equals、hashcode 方法。
@Data public class Example {
private String name; private String age;
}
等于为:
import lombok.*;
@Setter
@Getter
@ToString
@EqualsAndHashCode
@NoArgsConstructor
public class Example {
private String name;
private String age;
}