Lombok是什么?

Lombok是一个很牛批的插件(本质是个Java库),项目里一旦引入了Lombok神器之后,只要程序中使用相关注解,那么你项目中所有诸如:对象的构造函数、 equals()方法,属性的 get()/set()方法等等,这些没有技术含量的代码统统都不用写了,Lombok帮你搞定一切,全部帮你自动生成!

怎样使用Lombok?

1、IDEA下载插件

2、引入依赖

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
        </dependency>

常用的注解

1、@Data

作用于类上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor,当类的属性中没有必须属性(即使用final关键字声明的属性),那么会生成一个无参构造器。否则生成一个由所有被final关键字(或者将标记为@NoNull的属性生成一个构造器 )声明属性的有参构造函数。

  • 没有final声明的属性
  • @Data
    public class Student {
        private String id;
        private String name;
        private Date birthday;
    }
    ====================================
    //...
        Student student = new Student();
        student.setId("20200202");
        student.setName("莫提");
        student.setBirthday(new Date());
        System.out.println(student);
    //...
  • final声明的属性
  • @Data
    public class Student {
        private String id;
        private final String name;
        private Date birthday;
    }
    ====================================
    //...
        Student student = new Student("莫提");
        student.setId("20200202");
        student.setBirthday(new Date());
        System.out.println(student);
    //...

    2、@Getter和@Setter

    为属性生成对应的get()set(),声明在类上的时候为所有属性生成对应方法,声明在某个属性的时候,为这个属性生成对应方法。

    @Getter
    @Setter
    public class Student {
        private String id;
        private String name;
        private Date birthday;
    }
    ====================================
    //...
        Student student = new Student();
        student.setId("20200202");
        student.setName("莫提");
        student.setBirthday(new Date());
    //...

    3、@Builder

    对象的创建即可使用 链式表达 的方式一行代码完成, 看到这里,如果你学过设计模式中的 “建造者模式” 的话,一定能猜到 @Builder注解就是一个典型的“建造者模式”的实现案例!

    @Builder
    public class Student {
        private String id;
        private String name;
        private Date birthday;
    }
    ====================================
    //...
    Student student = Student.builder().id("1").name("莫提").birthday(new Date()).build();
    //...

    3、构造函数注解

    1. @AllArgsConstructor(全参构造)
    2. @NoArgsConstructor (空参构造)
    3. @RequiredArgsConstructor (部分参数构造,参数使用final关键字声明)

    注意这里 @RequiredArgsConstructor 和 @NoArgsConstructor 不能同时出现,因为当一个属性被final关键字声明后,创建对象的时候一定要给这个属性传参,所以可以理解这两个注解是冲突的。

  • 空参构造和全参构造
  • @NoArgsConstructor
    @AllArgsConstructor
    public class Student {
        private String id;
        private String name;
        private Date birthday;
    }
    ====================================
    //...
    Student student1 = new Student();
    Student student2 = new Student("1","moti",new Date());
    //...
  • 部分参数构造和全参构造
  • @RequiredArgsConstructor
    @AllArgsConstructor
    public class Student {
        private final String id;
        private String name;
        private Date birthday;
    }
    ====================================
    //...
    Student student1 = new Student("1");
    Student student2 = new Student("1","moti",new Date());
    //...

    4、@NonNull

    Lombok的 @NonNull注解可以自动帮我们避免空指针判断。主要作用于成员变量和参数中,标识不能为空,否则抛出空指针异常。

    public static void testNonNull(@NonNull String input){
        System.out.println(input);
    }
    
    public static void main(String[] args) {
        testNonNull(null);
    }

    运行main方法之后,控制台报错。

    5、@Cleanup

    自动关闭资源,针对实现了java.io.Closeable接口的对象有效,如:典型的IO流对象,也就是不需要在finally子句里面手动关闭资源了。

        public void testCleanup() {
            @Cleanup BufferedReader br = null;
            @Cleanup FileReader fileReader = null;
            try {
                fileReader = new FileReader("hehe.txt");
                br = new BufferedReader(fileReader);
                //中间一些流操作
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }

    6、@SneakyThrows

    可以对受检异常进行捕捉并抛出

    对上面的程序进行简化

        @SneakyThrows
        public void testSneakyThrows() {
            @Cleanup BufferedReader br = null;
            @Cleanup FileReader fileReader = null;
                fileReader = new FileReader("hehe.txt");
                br = new BufferedReader(fileReader);
                //中间一些流操作
        }

    注解表

    注解名作用
    @Setter 生成setter方法,final变量不包含
    @Getter 生成getter方法,final变量不包含
    @NoArgsConstructor 生成空参构造
    @AllArgsConstructor 生成全部参数构造
    @RequiredArgsConstructor 将标记为@NoNull的属性生成一个构造器
    @ToString 生成所有属性的toString()方法
    @EqualsAndHashCode 生成equals()方法和hashCode方法
    @Data(常用) @Data直接修饰POJO or beans, getter所有的变量,setter所有不为final的变量。如果你不需要默认的生成方式,直接填写你需要的annotation的就可以了。默认生成的所有的annotation都是public的,如果需要不同权限修饰符可以使用AccessLevel.NONE选项。当然@Data 也可以使用staticConstructor选项生成一个静态方法。
    =@Setter+@Getter+@EqualsAndHashCode+@NoArgsConstructor
    @Builder 构造Builder模式的结构。通过内部类Builder()进行构建对象。
    @Value 与@Data相对应的@Value, 两个annotation的主要区别就是如果变量不加@NonFinal ,@Value会给所有的弄成final的。当然如果是final的话,就没有set方法了。
    @Synchronized 同步方法
    @Cleanup 自动调用close方法关闭资源
    @SneakyThrows 可以对受检异常进行捕捉并抛出
    最后修改日期:2020-07-12

    作者

    留言

    撰写回覆或留言

    发布留言必须填写的电子邮件地址不会公开。