lombok学习笔记

⚠️别让 Lombok 使你的 Java 代码处于“亚健康”状态

@Getter/@Setter

  • 可以加到的变量或者整个类上(只包含所有 非 static 的变量)

  • boolean 类型的 getter 前缀是 is,如: isFoo()

  • getter/setter 方法 默认是public修饰符,可指定AccessLevelPUBLIC, PROTECTED, PACKAGEPRIVATE

  • 加到类上时,可通过给某个变量加 @Setter(AccessLevel.NONE)@Getter(AccessLevel.NONE) 排除其的 getter/setter 方法

  • 支持配置:选择特定前缀的变量、链式调用(返回 this)、去除 get\get\is 默认前缀、禁用 getter\setter

@ToString

  • 重写 toString 方法,自动包含 非 static的变量名和值,方便 debug 输出

  • @ToString只能加到类上,@ToString.Include@ToString.Exclude加到变量上

  • @ToString(callSuper = true) 将父类的toString方法包含进去,一般不建议

  • 实例变量很多时,可通过 of 参数指定包含的项 @ToString(of = {"name", "age"})

  • of 参数不能与 @ToString.Exclude/ @ToString.Include 一起用

  • 只排除个别变量,其他的都需要时,给类加上@ToString,再给个别变量加 @ToString.Exclude 将其排除

  • @ToString.Include@ToString(onlyExplicitlyIncluded = true)配合使用,会只包含加了@ToString.Include注解的变量

  • @ToString.Include(rank = -1),rank 参数调整输出顺序,参数指定 rank 将认为 rank=0,高 rank 的会先输出,相同 rank 时按照源代码中的顺序输出

  • 支持配置:包含属性名和值还是只包含值,使用 getter 方法获取值还是直接访问值,使用@ToString 时标记为警告/错误。

@EqualsAndHashCode

并不建议使用,还是根据实际情况手动实现 equalshashCode 方法

  • 作用于类,覆盖默认的equalshashCode
  • 默认将使用所有的 non-static 和 non-transient 字段(变量),也可通过@EqualsAndHashCode.Include or @EqualsAndHashCode.Exclude手动指定包含哪些变量参与计算
  • 另外也可 @EqualsAndHashCode.Include@EqualsAndHashCode(onlyExplicitlyIncluded = true)配合使用,指定包含哪些变量参与计算

@NonNull

  • 主要作用于成员变量和参数中,标识不能为空,否则抛出空指针异常,相当于if (param == null) throw new NullPointerException("param");
  • 生成的null检查语句会插入到方法的最前端,如果是构造函数,则在this()super()调用之后插入null检查。

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor

  • @NoArgsConstructor生成一个无参数构造函数

  • 如果有 final 修饰的字段且未初始化就不能用 @NoArgsConstructor

  • @NoArgsConstructor 会将标记为@NonNull的字段初始化为0 / false / null

  • @RequiredArgsConstructor: 生成构造函数;如果带有参数,参数包含所有的以final修饰并并且初始化的字段和@NonNull注解的并且未初始化的字段,参数的顺序和字段在类中的声明顺序一致。

  • @AllArgsConstructor, 生成全参数构造函数,将类中的每个字段生成带有 1 个参数的构造函数,例如有 3 个字段,则构造函数的参数为 3 个

  • 忽略 static 字段

  • 使用 staticName 参数可生成 static 工厂函数,作用跟构造方法一样,比如 @RequiredArgsConstructor(staticName="of"),然后就可以通过静态方法 MapEntry.of("foo", 5) 实例化,而不用 new 关键字

  • 也可通过 access 参数指定作用范围 @NoArgsConstructor(access = AccessLevel.PRIVATE)

@Data

  • 隐式地包含了@ToString, @EqualsAndHashCode,所有字段的 @Getter,非 final 字段的 @Setter, 和@RequiredArgsConstructor的功能

  • 只有一个staticConstructor参数,指定静态工厂函数名

  • 没有其他指定任何参数(比如 callSuper, includeFieldNamesexclude) ,所以以上包含的注解都表现为其默认参数下的行为

  • 如果您需要为这些参数中的任何一个设置非默认值,只需显式地添加这些注释

  • 所有生成的 getter\setter 作用域都是 public

@Builder

  • 为类、构造器、方法上生成复杂的构建器 API,将类转变为建造者模式。实例化方式变为:Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();

@Cleanup

  • 给局部变量添加该注解,使代码块结束后自动调用其 close() 方法释放资源,类似于 try/finally 代码块
  • 如果该对象没有 close 方法,需要指定其释放资源的方法名,例如:@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);
  • 对象释放资源的方法不允许有参数

@SneakyThrows

  • 可以对受检异常进行捕捉并抛出,谨慎使用

通常使用在以下两种异常上

import lombok.SneakyThrows;

public class SneakyThrowsExample implements Runnable {
  @SneakyThrows(UnsupportedEncodingException.class)
  public String utf8ToString(byte[] bytes) {
    return new String(bytes, "UTF-8");
  }

  @SneakyThrows
  public void run() {
    throw new Throwable();
  }
}

@Synchronized

  • 作用于方法级别,可以替换 synchronize 关键字或 lock 锁

@Log

  • 作用于类上,生成日志变量。针对不同的日志实现产品,有不同的注解

其他参考:

  • Lombok 使用 - SegmentFault 思否
  • Lombok 的基本使用 - 简书

你可能感兴趣的:(java,maven,intellij-idea)