Intellij IEDA 使用lombok,代码简约而不简单

来源:互联网 发布:朴廷桓柯洁网络十番棋 编辑:程序博客网 时间:2024/05/16 16:00

  • lombok介绍
    • 特性介绍
    • lombok实现原理
  • lombok使用
    • IDEA lombok插件安装
    • Demo介绍

lombok介绍

lombok提供通过注解来创建代码,以达到避免编写样板代码,简约代码的目的,特别对于POJO类,效果显著,而且可以规避一些代码检查工具的检查(在公司内很有用)。

特性介绍

  1. val关键字:
    修饰final的局部变量,duck type风格

    public String example() {      val example = new ArrayList();      example.add("Hello, World!");      val foo = example.get(0);      return foo.toLowerCase();} 
  2. 注解:
    参考 lombok全特性

    • @NonNull:修饰方法参数/成员变量,如果入参为空,则抛出NPE
    • @Cleanup:修饰函数中Closable类的实例,自动添加try-finally,执行close
    • @Getter/@Setter:修饰类/成员变量,提供get/set方法
    • @ToString:修饰类,重写toString()
    • @EqualsAndHashCode:根据类的成员变量生成equal和hashCode()
    • @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor:创建构造函数
    • @Data:@ToString, @EqualsAndHashCode, @Getter @Setter @RequiredArgsConstructor 组合
    • @Value:修饰类,让类的实例不可通过引用修改内部成员,具备Immutable特性
    • @Builder:修饰类,会生成static的内部类Builder,使用Builder模式
    • @SneakyThrows:修饰方法,生成try-catch,并抛出非运行异常
    • @Synchronized:修饰方法,同步代码
    • @Getter(lazy=true):修饰变量,对变量生成双重检测的get代码
    • @Log:修饰类,给类生成一个log的成员变量

lombok实现原理

lombok利用了JDK6的新特性:JSR-000269 Pluggable Annotation Processing API(插入式注解API)。
Javac在编译过程变成:
1. 先对源码分析,生成一棵抽象语法树,
2. 再不断调用实现了JAR 269 API的程序,根据注解修改了抽象语法树,直到语法树不再被修改为止
3. javac根据修改后的抽象语法树生成.class字节码

lombok使用

IDEA lombok插件安装

lombok插件安装

Demo介绍

通过IDEA创建一个maven-archetype-quickstart的Maven工程。
添加lombok依赖,由于使用Log注解,加上Slf4j依赖:

    <dependency>      <groupId>org.projectlombok</groupId>      <artifactId>lombok</artifactId>      <version> 1.16.18</version>          </dependency>    <dependency>      <groupId>org.slf4j</groupId>      <artifactId>slf4j-simple</artifactId>      <version>1.7.25</version>    </dependency>    <dependency>      <groupId>org.slf4j</groupId>      <artifactId>slf4j-api</artifactId>      <version>1.7.25</version>    </dependency>

App代码如下:

import lombok.Builder;import lombok.Data;import lombok.NonNull;import lombok.extern.slf4j.Slf4j;@Slf4jpublic class App {    public static void main( String[] args ){        Person person;        try {            person = Person.builder().age(10).build();        }catch (NullPointerException  e){            log.error(e.getMessage());        }        person = Person.builder().age(10).name("foo").build();        log.info(person.toString());    }    @Data    @Builder    public static class Person{        @NonNull private String name;        private int age;    }}

输出如下:

[main] ERROR edu.fate.App - name[main] INFO edu.fate.App - App.Person(name=foo, age=10)

Demo中使用的都是常用的注解,其他注解不常用,并且使用时要谨慎并要理解原理。

Demo工程传送门

原创粉丝点击