Lombok没有那么简单

Lombok

Lombok很多人都用到了,但网上对他的介绍大多数都是什么呢能自动生成GetSet方法
而实际的Lombok并没有那么简单,下面给大家介绍一下Lombok冷门但实用的各种功能.

自动判空@NonNull

可以注释在方法参数上或者字段上
如果注释在方法参数上会在方法的第一行添加下面的语句
例子:

public void a(@NonNull List<String> staffIdList, @NonNull String applyFormId, @NonNull String applyFormNo) 

会生成:

    public void a(@NonNull List<String> staffIdList, @NonNull String applyFormId, @NonNull String applyFormNo) {
        if (staffIdList == null) {
            throw new NullPointerException("staffIdList is marked non-null but is null");
        } else if (applyFormId == null) {
            throw new NullPointerException("applyFormId is marked non-null but is null");
        } else if (applyFormNo == null) {
            throw new NullPointerException("applyFormNo is marked non-null but is null");
        }

如果加到字段上,会给所有为该字段赋值的地方都添加判空语句
例子:

 @NonNull
 private String id;

会生成

 public 构造方法(@NonNull final String id) {
        if (id == null) {
            throw new NullPointerException("id is marked non-null but is null");
 public void set方法(@NonNull final String id) {
        if (id == null) {
            throw new NullPointerException("id is marked non-null but is null");

自动close资源流@Cleanup

它可以注释在我们的局部变量前,功能是将被注释的变量自动进行try-finally包裹,并调用他的close方法
例子:

public void copyFile(String in, String out) throws IOException {
      @Cleanup FileInputStream inStream = new FileInputStream(in);
      @Cleanup FileOutputStream outStream = new FileOutputStream(out);
      byte[] b = new byte[65536];
      while (true) {
          int r = inStream.read(b);
          if (r == -1) break;
          outStream.write(b, 0, r);
      }
  }

会生成如下代码

public void copyFile(String in, String out) throws IOException {
      @Cleanup FileInputStream inStream = new FileInputStream(in);
      try {
          @Cleanup FileOutputStream outStream = new FileOutputStream(out);
          try {
              byte[] b = new byte[65536];
              while (true) {
                  int r = inStream.read(b);
                  if (r == -1) break;
                  outStream.write(b, 0, r);
              }
          } finally {
              if (outStream != null) outStream.close();
          }
      } finally {
          if (inStream != null) inStream.close();
      }
  }

任何变量类型 val/var

可以用于定义任何变量,注意这个不用加@
例子:

    val list =new ArrayList<String>();
    list.toArray()

会生成:

        ArrayList<String> list = new ArrayList();
        list.toArray();

链式构造对象@Builder

可以注释在类上面,可以使用类Builder来方便的构造对象
例子:

@Builder
  class Example<T> {
    private T foo;
    private final String bar;
  }

会生成:

class Example<T> {
    private T foo;
    private final String bar;
    
    private Example(T foo, String bar) {
        this.foo = foo;
        this.bar = bar;
    }
    
    public static <T> ExampleBuilder<T> builder() {
        return new ExampleBuilder<T>();
    }
    
    public static class ExampleBuilder<T> {
        private T foo;
        private String bar;
        
        private ExampleBuilder() {}
        
        public ExampleBuilder foo(T foo) {
            this.foo = foo;
            return this;
        }
        
        public ExampleBuilder bar(String bar) {
            this.bar = bar;
            return this;
        }
        
        @java.lang.Override public String toString() {
            return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
        }
        
        public Example build() {
            return new Example(foo, bar);
        }
    }
  }

使用:

 Example build = Example.builder().foo(1).bar("").build();

即可方便的build一个对象
自动生成log对象 @Slf4j/@Log4j/@JBossLog
可以自动生成打日志使用的log对象,支持主流日志框架
使用:

 @Slf4j
  public class LogExample {
  }

会生成:

  public class LogExample {
      private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
  }

如果想使用Log4j的log对象,注释换为@Log4j即可
自动catch异常 @SneakyThrows
可以注释在方法上,可以自动catch掉所有已检查异常
使用:

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

会生成

public void utf8ToString(byte[] bytes) {
      try {
          return new String(bytes, "UTF-8");
      } catch (UnsupportedEncodingException $uniqueName) {
          throw useMagicTrickeryToHideThisFromTheCompiler($uniqueName);
          // This trickery involves a bytecode transformer run automatically during the final stages of compilation;
          // there is no runtime dependency on lombok.
      }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值