【代码规范】lombok注解使用

Source

【代码规范】lombok注解使用

一、前言

上一篇文章(【JVM知识】插入式注解处理器实现java编程规范检测)总结了一下插入式注解,我们知道lombok插件是通过插入式注解处理器实现的,并且lombok插件在工作中用的比较多,所以再总结一下lombok常用注解

在这里插入图片描述
在这里插入图片描述
请添加图片描述
lombok官网地址

二、常用注解

@Getter/@Setter
@ToString
@EqualsAndHashCode
@NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor
@Data
@Value
@Builder
@Slf4j
@Accessors
@SneakyThrows
@Synchronized
@Cleanup

三、使用示例

1、使用@Getter/@Setter来代替 getter 和 setter 方法使代码更简洁
@EqualsAndHashCode注解通过of属性指定参与equals hashcode字段
@ToString注解通过of属性 可以配置字段

@Getter
@Setter
@EqualsAndHashCode(of = {
    
      "name","age"})  //指定参与equals hashcode字段
@ToString(of = {
    
      "name","age"}) //toString 可以配置字段
private static class User01{
    
      
  private String name;
  private Integer age;
  private Byte sex;
}

2、Lombok提供了一系列的关于构造器的注解,包括无参构造器和有参构造器。

  • @NoArgsConstructor 为实体类生成无参的构造器方法
  • @AllArgsConstructor 为实体类生成除了static修饰的字段之外带有各参数的构造器方法。
  • @RequiredArgsConstructor 为实体类生成指定字段的构造器方法,而这些字段需要被 final,或者 @NonNull 修饰。
@NoArgsConstructor(access = AccessLevel.PRIVATE) //无参构造函数
    @AllArgsConstructor //全参构造函数
    private static class User02{
    
      
        private String name;
        private Integer age;
        private Byte sex;
    }

3、@Value所有的成员变量都是 final 的,没有 setter 方法,适合加在值不希望被改变的类上,像是某个类的值当创建后就不希望被更改,只希望读它而已

@Data
    @Value
    private static class User03{
    
      
        private String name;
        private Integer age;
        private Byte sex;
    }

4、@Builder 是一个非常强大的注解,提供了一种基于建造者模式的构建对象的 API。使用 @Builder 注解为给我们的实体类自动生成 builder() 方法,并且直接根据字段名称方法进行字段赋值,最后使用 build()方法构建出一个实体对象。

@Builder
    private static class User04{
    
      
        private String name;
        private Integer age;

        @Singular("addDog")
        private List<String> dogs;

        public static void main(String[] args) {
    
      
            User04 user04 = User04.builder().name("张三").age(18).addDog("大黄").addDog("二哈").build();
            System.out.println(user04);
        }
    }

5、@SneakyThrows等同于public void exceptionTest() throws Exception{}

@SneakyThrows
    public void exceptionTest(){
    
      
        Thread.sleep(1000);
    }

6、@Synchronized等同于public synchronized void concurrency(){}

@Synchronized
    public void concurrency(){
    
      

    }

7、@Cleanup可以关闭流

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

8、@Accessors(fluent = true) 注解没有set和get方法,易读性不是很好

@Data
    @Accessors(fluent = true)  //没有set和get
    private static class User05{
    
      
        private String name;
        private Integer age;

        public static void main(String[] args) {
    
      
            User05 user05 = new User05();
            user05.age(16);
            System.out.println(user05.age());
        }
    }

9、@Accessors(chain = true) 注解链式设置对象参数

@Data
    @Accessors(chain = true)  
    private static class User06{
    
      
        private String name;
        private Integer age;

        public static void main(String[] args) {
    
      
            User06 user06 = new User06();
            user06.setName("张三").setAge(16);
            System.out.println(user06.toString());
        }
    }

10、@FieldNameConstants作用于类,生成一个包含所有成员变量的内部类或者内部枚举,内部类中每个字段值即为字段名,并且内部类字段值不可变

属性说明:

  • value:设置内部类或者枚举的访问控制符,默认为 public 共有
    PUBLIC、MODULE、PROTECTED、PACKAGE、PRIVATE、NONE MODULEJava 9
    的新特性
    ,NONE 表示不生成 setter 方法,即停用注解功能
  • asEnum:是否为枚举类型,默认 false
  • innerTypeName:设置内部类或枚举名,默认值:“”,默认内部类名:Fields
  • onlyExplicitlyIncluded:仅包含标记为 @FieldNameConstants.include的字段,默认为
    false
  • Include:设置包含哪些字段
  • Include 只有在 onlyExplicitlyIncluded = true 时才会生效,Include
    标记在需要包含的属性或方法上 当 onlyExplicitlyIncluded = true 时,则必须搭配 Include
    使用,否则没有任何效果
  • Exclude:设置不包含哪些字段
@FieldNameConstants(innerTypeName = "刘能", asEnum = true, level = AccessLevel.PRIVATE, onlyExplicitlyIncluded = true)
public class ZhangTianAi {
    
      
	@FieldNameConstants.Include
	private String name;
	
	@FieldNameConstants.Exclude
	private Integer age;
	
	public static void main(String[] args) {
    
      
		System.out.println(刘能.name);
	}
}