java Lombok插件

@Lombok有啥牛皮的?SpringBoot和IDEA官方都要支持它!

https://www.jianshu.com/p/2543c71a8e45

官方文档:https://projectlombok.org/features/all

IDEA 2020最后一个版本已经内置了Lombok插件,SpringBoot 2.1.x之后的版本也在Starter中内置了Lombok依赖。

使用后 getter/setter/toString;异常处理;I/O流的关闭操作等等,只需要一个注释就可以搞定

1、maven
<!--lombok依赖-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
    <scope>provided</scope>
</dependency>

SpringBoot 2.1.x版本后无需指定Lombok版本,SpringBoot在spring-boot-dependencies中已经内置。

2、Lombok注解的使用

val

使用val注解可以取代任意类型作为局部变量,这样我们就不用写复杂的ArrayList和Map.Entry类型了,具体例子如下。

//val代替ArrayList<String>和String类型
        val example = new ArrayList<String>();

//val代替Map.Entry<Integer,String>类型
        val map = new HashMap<Integer, String>();

当我们使用了val注解后,Lombok会从局部变量的初始化表达式推断出具体类型

@NonNull

在方法上使用@NonNull注解可以做非空判断,如果传入空值的话会直接抛出NullPointerException。

 public NonNullExample(@NonNull String name){
        this.name = name;
 }

编译后会在构造器中添加非空判断

@Cleanup

当我们在Java中使用资源时,不可避免地需要在使用后关闭资源。使用@Cleanup注解可以自动关闭资源。

//使用输入输出流自动关闭,无需编写try catch和调用close()方法
        @Cleanup ByteArrayInputStream in = new ByteArrayInputStream(inStr.getBytes("UTF-8"));
        @Cleanup ByteArrayOutputStream out = new ByteArrayOutputStream();

@Getter/@Setter

有了@Getter/@Setter注解,我们再也不用编写getter/setter方法了。

    @Getter
    @Setter

    private String name;
    @Getter
    @Setter(AccessLevel.PROTECTED)

    private Integer age;

@Getter/@Setter: 作用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员变量的getter/setter方法。可以设定访问权限及是否懒加载等。

@Getter(lazy=true)

当我们获取某一个属性比较消耗资源时,可以给@Getter添加lazy=true属性实现懒加载,会生成Double Check Lock 样板代码对属性进行懒加载。

@ToString

把所有类属性都编写到toString方法中方便打印日志,是一件多么枯燥无味的事情。使用@ToString注解可以自动生成toString方法,默认会包含所有类属性,使用@ToString.Exclude注解可以排除属性的生成,该属性不在tostring中显示。可以通过of属性限定显示某些字段。

@ToString
public class ToStringExample {
    @ToString.Exclude
    private Long id;
    private String name;
    .....
}

java Lombok插件

@EqualsAndHashCode

使用@EqualsAndHashCode注解作用于类可以自动生成hashCode和equals方法,默认包含所有类属性,使用@EqualsAndHashCode.Exclude可以排除属性的生成。

@XxConstructor

自动生成构造方法,有三个注解可以使用。

  • @NoArgsConstructor:生成无参构造函数。

  • @RequiredArgsConstructor:生成包含必须参数的构造函数,使用@NonNull注解的类属性为必须参数。有@NonNull注解的类属性,的构造器

  • @AllArgsConstructor:生成包含所有参数的构造函数。

有staticName、access等属性,staticName属性一旦设定,将采用静态方法的方式生成实例,access属性可以限定访问权限。

@NoArgsConstructor
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor
public class ConstructorExample {...}

@Data:作用于类上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor

@Builder:作用于类上,将类转变为建造者模式

@Log:作用于类上,生成日志变量。针对不同的日志实现产品,有不同的注解:

其他重要注解:

@Cleanup:自动关闭资源,针对实现了java.io.Closeable接口的对象有效,如:典型的IO流对象

@Value:使用@Value注解可以把类声明为不可变的,声明后此类相当于final类,无法被继承,其属性也会变成final属性。

@SneakyThrows:自动实现捕获并抛出异常,用在方法前,相当于对方法中的代码块实行了try-catch操作,可以指定异常类

@Synchronized:作用于方法级别,可以替换synchronize关键字或lock锁,用处不大.

@With

使用@With注解可以实现对原对象进行克隆,并改变其一个属性。即,生成一个改变了其中一个属性的新对象。

使用时需要指定全参构造方法,@AllArgsConstructor

@With
@AllArgsConstructor
public class WithExample {
    private Long id;
    private String name;
    private Integer age;

    public static void main(String[] args) {
        WithExample example1 = new WithExample(1L, "test", 20);
        WithExample example2 = example1.withAge(22);
        //将原对象进行clone并设置age,返回false
        System.out.println(example1.equals(example2));
    }
}

@Log

使用@Log注解在类上,可以直接生成日志对象log,通过log对象可以直接打印日志。

@Slf4j

使用Lombok生成日志对象时,根据使用日志实现的不同,有多种注解可以使用。比如@Log、@Log4j、@Log4j2、@Slf4j等。

上一篇:Lombok


下一篇:Lombok天天用,它的原理是什么你知道吗?