20190905 Lombok常用注解
Lombok常用注解
稳定功能
val
只能用于局部变量,声明的局部变量为 final
// 用于局部变量
val j = 2;
val map = new HashMap<Integer, String>();
// 用于for-each
for (val entry : map.entrySet()) {
}
var
var
和 val
基本一样,只能用于局部变量,声明的局部变量不是 final
可以再次赋值,但是不能赋予不同类型
在jdk8中可以用,从jdk10开始,出现了关键字 var
,功能一样,功能被覆盖了
// 用于局部变量,可以修改
var message = "Hello World";
message = "abc";
@NonNull
用于方法参数、构造函数参数、record类型组件
使用@NonNull
方法或构造函数的参数让lombok为您生成null-check语句。
注解类字段时,生成的Setter方法和构造器中会执行非空检查。
// 生成的Setter方法中会检查NPE
@Setter
@NonNull
private String name;
// 用于方法参数,会检查NPE
public void test1(@NonNull String s1, String s2) {
System.out.println(s1 + s2);
}
@Cleanup
用于局部变量
使用try-finally包裹代码,默认执行 close()
,也可以指定其他无参方法
调用清理方法的顺序是声明顺序的倒序
类似 try-with-resource
语法
// 会用try-finally包裹代码,并执行close方法
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);
@Getter和@Setter
用于类和类字段上,让lombok自动生成默认的 getter / setter
配合 AccessLevel 指定方法级别,默认 public
@Getter(lazy=true)
为 private final
字段生成线程安全的懒加载方法,但是要在定义时指定值
@ToString
生成 toString()
方法
默认情况下,它会按顺序打印类名称以及每个字段,并以逗号分隔
可以通过 @ToString
的一些属性控制字段是否打印
@EqualsAndHashCode
生成 hashCode
和 equals
方法
@NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstructor
生成构造函数
@NoArgsConstructor
:无参构造函数@RequiredArgsConstructor
: 包含未初始化的final
字段、标记为@NonNull
且未初始化的字段@AllArgsConstructor
:参数为类中的所有字段
@Data
以下注解的组合:
@ToString
@EqualsAndHashCode
@Getter
@Setter
@RequiredArgsConstructor
@Value
@Value
是 @Data
的不可变的变体
所有字段都是 final
的
@Builder
为类生成 Builder 模式的 API
@Builder
public class MyData {
private String s1;
private String s2;
private int i1;
public static void main(String[] args) {
MyDataBuilder builder = MyData.builder();
MyData myData = builder.s1("s1").s2("s2").i1(1).build();
}
}
@Builder.Default
为字段设置默认值
@Builder.Default
private long created = System.currentTimeMillis();
@Singular
配合 @Builder
使用,应用在集合字段上
字段名称必须是复数形式(一般带s,例如names),否则会报错
会为 Builder 类生成三个方法:
- dress:add 单个
- dresses:addAll 多个
- clearDresses:clear 集合
@SneakyThrows
@SneakyThrows
帮助避免在方法声明中添加 throws 子句,但是被包裹的方法抛出的异常不会有任何改变
@SneakyThrows
public void run() {
throw new Throwable();
}
@Synchronized
用于方法上
@Synchronized
是 synchronized
修饰符的更安全的变体。它的操作与synchronized关键字类似,但它锁定的对象不同。关键字锁定的是这个对象,但注解锁定的是一个名为\(lock的字段,它是私有的。如果这个字段不存在,它就会为你创建。如果你注释了一个静态方法,注释会锁定一个名为\)LOCK的静态字段。
@With
用于字段上
新增一个方法 withFieldName(newValue)
方法,它产生一个除了相关字段的新值以外的克隆
日志注解
日志记录器被命名为 log
,字段的类型取决于你所选择的记录器。
注解 | 类型 |
---|---|
@CommonsLog | org.apache.commons.logging.Log |
@Flogger | com.google.common.flogger.FluentLogger |
@JBossLog | org.jboss.logging.Logger |
@Log | java.util.logging.Logger |
@Log4j | org.apache.log4j.Logger |
@Log4j2 | org.apache.logging.log4j.Logger |
@Slf4j | org.slf4j.Logger |
@XSlf4j | org.slf4j.ext.XLogger |