Lombok解析

218 阅读1分钟

官网:projectlombok.org

  1. val:

    修饰的变量无需指定类型,且变量为不可变(使用 final 修饰)。

  2. var:

    修饰的变量无需指定类型,变量为可变类型。

  3. @NonNull

    修饰的变量不能为空,为空则报 NullPointerException。

  4. @Cleanup

    修饰的变量资源在代码块结束后会自动清理,调用 close 方法。

    @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);
    }
  1. @Getter/@Setter

    修饰的变量自动生成 set get 方法。

  2. @ToString

    修饰的对象自动生成 ToString 方法。

  3. @EqualsAndHashCode

  4. @ NoArgsConstructor,@ RequiredArgsConstructor,@ AllArgsConstructor

    对象构造器。

  5. @Data

    综合注解。

  6. @Value

    修饰的类的字段为 final 不可变。

  7. @Builder

    作用于类,该类对象可使用链式编程构造。

   @Test
    public void test() {
        Person person = Person.builder()
                .name("test")
                .age(29)
                .build();
    }
  1. @SneakyThrows

    作用于方法,可自动生成 try{}catch(){}语句。

  2. @Synchronized

    修饰的方法自动创建锁对象,并使用 synchronized 修饰代码块(每个方法都是使用不同的锁对象)。

public class SynchronizedExample {
  private final Object readLock = new Object();
  
  @Synchronized
  public static void hello() {
    System.out.println("world");
  }
  
  @Synchronized
  public int answerToLife() {
    return 42;
  }
  
  @Synchronized("readLock")
  public void foo() {
    System.out.println("bar");
  }
}

public class SynchronizedExample {
  private static final Object $LOCK = new Object[0];
  private final Object $lock = new Object[0];
  private final Object readLock = new Object();
  
  public static void hello() {
    synchronized($LOCK) {
      System.out.println("world");
    }
  }
  
  public int answerToLife() {
    synchronized($lock) {
      return 42;
    }
  }
  
  public void foo() {
    synchronized(readLock) {
      System.out.println("bar");
    }
  }
}
  1. @Getter(lazy = true)

    修饰的变量为 final 不可变类型,可在计算复杂的变量时使用,第一次的计算结果将会被缓存,不会出现重复赋值的情况,可用于单例对象 double check lock 的机制。

  2. @Log

    日志输出。