Lombok没有那么简单

642 阅读2分钟

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.
      }