Lombok 常用注解

经常用 @Data 注解标记在实体类上面快速实现gettersetter, 而它好用地注解应该不至于这一个,下面是常用的注解汇总:
1. @Data 注解 : 一般用在类上,提供类所有属性的 getset 方法,此外还提供了equalscanEqualhashCodetoString等方法;
2. @Setter 注解:一般用在属性上,为属性提供 set 方法, 用在再类上则表示当前类中所有属性都生成set方法;
3. @Getter 注解:用在属性上,为属性提供 get 方法, 用在再类上表示当前类中所有属性都生成get方法;
4. @Log4j or @Slf4j 注解 :用在类上,为类提供一个 属性名为loglog4j日志对象;
5. @NoArgsConstructor注解:用在类上,为类提供一个无参的构造方法;
6. @AllArgsConstructor注解:用在类上,为类提供一个全参的构造方法;
7. @RequiredArgsConstructor注解: 用在类上,生成一个包含 "特定参数" 的构造器,特定参数指的是那些有加上 final 修饰词的变量们;
8. @Builder注解: 用在类上,自动生成流式 set 值写法,从此之后再也不用写一堆 setter 了;
image.png

注意,虽然只要加上 @Builder 注解,我们就能够用流式写法快速设定对象的值,但是 setter 还是必须要写不能省略的,因为 Spring 或是其他框架有很多地方都会用到对象的 getter/setter 对他们取值/赋值所以通常是 @Data@Builder 会一起用在同个类上,既方便我们流式写代码,也方便框架做事;
9. @Cleanup注解: 可以用在 IO 流上,用于关闭并释放资源;
例如下面例子,每次IO流操作后要在finally中关闭流,释放资源:

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    InputStream in = new FileInputStream(args[0]);
    try {
      OutputStream out = new FileOutputStream(args[1]);
      try {
        byte[] b = new byte[10000];
        while (true) {
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        }
      } finally {
        if (out != null) {
          out.close();
        }
      }
    } finally {
      if (in != null) {
        in.close();
      }
    }
  }
}

类似以上的一个IO流操作的方法使用lombok 的 @Cleanup 注解后可以简化成这样:

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);
        }
    }
}
  1. @SneakyThrows 注解:利用了这一机制,将当前方法抛出的异常,包装成RuntimeException,骗过编译器,使得调用点可以不用显示处理异常信息,使用注解后不需要担心Exception的处理。例如:
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();
  }
}

真正生成的代码

import lombok.Lombok;

public class SneakyThrowsExample implements Runnable {
  public String utf8ToString(byte[] bytes) {
    try {
      return new String(bytes, "UTF-8");
    } catch (UnsupportedEncodingException e) {
      throw Lombok.sneakyThrow(e);
    }
  }
  
  public void run() {
    try {
      throw new Throwable();
    } catch (Throwable t) {
      throw Lombok.sneakyThrow(t);
    }
  }
}
posted @ 2022-03-18 11:07  ALLMON  阅读(142)  评论(0编辑  收藏  举报