lombok的用法

摘要

在我们日常码代码时经常会写很多重复且没有技术含量的代码,例如vo中property的get、set方法,构造函数,log的初始化等。lombok主要是以简单的注解形式来简化一些没有技术含量并且又不得不写的代码,提高了代码的简洁性。


用法

  1. 添加依赖

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.20</version>
        <scope>provided</scope>
    </dependency>
    
  2. IDEA安装lombok插件
    settings/plugins搜索lombok插件并安装


使用

  1. @Data
    注解在类上,为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法

    @Data
    public class User {
        private String name;
        private String sex;
    }
    
  2. @Getter/@Setter
    注解在类或字段上面,就是生成 get 和 set 方法

  3. @ToString
    注解在类上面,生成 toString 方法

  4. @EqualsAndHashCode
    注解在类上面,生成 hashCode 和 equals 方法

  5. @NoArgsConstructor
    注解在类,生成无参的构造方法
    相当于如下代码

    public class User {
        private String name;
        private Integer sex;
        public User() {
        }
    }
    
  6. @RequiredArgsConstructor
    注解在类上,生成包含final和@NonNull注解的成员变量的构造器
    相当于如下代码

    public class User {
        private String name;
        private final Integer sex;
        public User(final Integer sex) {
            this.sex = sex;
        }
    }
    
  7. @AllArgsConstructor
    注解在类,生成包含类中所有字段的构造方法
    相当于如下代码

    public class User {
        private String name;
        private final Integer sex;
        public User(final String name, final Integer sex) {
            this.name = name;
            this.sex = sex;
        }
    }
    
  8. @Slf4j
    这个也是用的比较多的,注解在类上,生成log常量
    相当于如下代码

    public class User {
        private static final Logger log = LoggerFactory.getLogger(User.class);
        private String name;
        private Integer sex;
    }
    
  9. @NonNull
    在属性或构造器上,Lombok会生成一个非空的声明,可用于校验参数,能帮助避免空指针

    public class NonNullExample {
      private String name;
      public NonNullExample(@NonNull User user) {
        super("Hello");
        this.name = user.getName();
      }
    } 
    
  10. @Cleanup
    帮助我们自动调用close()方法,很大的简化了代码

    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);
        }
      }
    }
    
  11. @Accessors
    用于配置getter和setter方法的生成结果,有三个属性

    fluent
    getter和setter方法的方法名都是基础属性名,且setter方法返回当前对象。如下

    @Data
    @Accessors(fluent = true)
    public class User {
        private Long id;
        private String name;
        
        // 生成的getter和setter方法如下,方法体略
        public Long id() {}
        public User id(Long id) {}
        public String name() {}
        public User name(String name) {}
    }
    

    chain
    setter方法返回当前对象。如下

    @Data
    @Accessors(chain = true)
    public class User {
        private Long id;
        private String name;
        
        // 生成的setter方法如下,方法体略
        public User setId(Long id) {}
        public User setName(String name) {}
    }
    

    prefix
    用于生成getter和setter方法的字段名会忽视指定前缀(遵守驼峰命名)。如下

    @Data
    @Accessors(prefix = "p")
    class User {
    	private Long pId;
    	private String pName;
    	
    	// 生成的getter和setter方法如下,方法体略
    	public Long getId() {}
    	public void setId(Long id) {}
    	public String getName() {}
    	public void setName(String name) {}
    }
    

原理

Lombok依靠可插件化的Java自定义注解处理API(JSR 269: Pluggable Annotation Processing API)在Javac编译阶段利用“Annotation Processor”对自定义的注解进行预处理后生成真正在JVM上面执行的“Class文件”。

在Javac 解析成AST抽象语法树之后, Lombok 根据自己编写的注解处理器,动态地修改 AST,增加新的节点(即Lombok自定义注解所需要生成的代码),最终通过分析生成JVM可执行的字节码Class文件


总结

优点

  • 能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率。
  • 让代码变得简洁,不用过多的去关注相应的方法。
  • 属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等。

缺点

  • 不支持多种参数构造器的重载。
  • 虽然代码变得简洁,但也大大降低了代码的可读性和完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值