Lombok消除冗长的Java代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangxishidayuan/article/details/52303272

1. 简介

Lombok提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码,即利用注解在编译期自动生成setter/getter/toString()/constructor之类的代码。代码越少,意味着出bug的可能性越低。
参考博客:https://projectlombok.org/features/index.html

2. 使用

首先要安装Lombok插件,然后导入相关jar包,就可以在代码里面使用注解来简化代码

1)val

val用来修饰局部变量,不用写具体的类型,通过初始化的表达式推出其类型,这个局部变量是final的

public String example() {
    val example = new ArrayList<String>();
    example.add("Hello, World!");
    val foo = example.get(0);
    return foo.toLowerCase();
}

public void example2() {
    val map = new HashMap<Integer, String>();
    map.put(0, "zero");
    map.put(5, "five");
    for (val entry : map.entrySet()) {
        System.out.printf("%d: %s\n", entry.getKey(), entry.getValue());
    }
}

2)@NonNull

确保方法或构造器的参数不为null,如果为null,则抛出异常

public class NonNullExample {
    private String name;

    public NonNullExample(@NonNull Person person) {
      this.name = person.getName();
    }
}

3)@Cleanup

保证资源的释放

public static void main(String[] args) throws IOException {
    //调用close方法来释放资源,也可以指定调用的方法
    @Cleanup InputStream in = new FileInputStream(args[0]);
    @Cleanup OutputStream out = new FileOutputStream(args[1]);
    byte[] b = new byte[1024];
    while (true) {
      int r = in.read(b);
      if (r == -1) 
          break;
      out.write(b, 0, r);
    }
}

4)@Getter And @Setter

自动生成POJO里面的getter方法和setter方法

public class GetterSetterExample {

    @Getter @Setter private int age = 10;
    //setName方法的访问权限为protected
    @Setter(AccessLevel.PROTECTED) private String name;
}

5)@ToString

自动生成toString方法

//排除id属性
 @ToString(exclude="id")
 public class ToStringExample {
   private static final int STATIC_VAR = 11; //常量自动排除
   private String name;
   private String[] tags;
   private int id;

 }

6)@EqualsAndHashCode

自动生成equals和hashCode方法

 @EqualsAndHashCode(exclude={"id"})
 public class EqualsAndHashCodeExample {
   private transient int transientVar = 11; //不参与
   private String name;
   private double score;
   private String[] tags;
   private int id; //排除

 }

7)NoArgsConstructor, @AllArgsConstructor,@RequiredArgsConstructor

自动生成构造器

//@NonNull声明的属性会自动生成该变量的构造器 或者final属性
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access=AccessLevel.PROTECTED)
public class ConstructorExample<T> {
    private int x, y;
    @NonNull private T description; //不能赋null

    @NoArgsConstructor
    public static class NoArgsExample {
      private String field;
    }
}

8)@Data

@Data 等价于@ToString, @EqualsAndHashCode, @Getter / @Setter and @RequiredArgsConstructor的组合

 @Data 
 public class DataExample {
    private final String name; //会生成构造函数
    @Setter(AccessLevel.PACKAGE) private int age;
    private double score;
    private String[] tags;
 }

猜你喜欢

转载自blog.csdn.net/jiangxishidayuan/article/details/52303272