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 可以对受检异常进行捕捉并抛出

版权声明:本文为cnmoti原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cnmoti/p/12304537.html