lombok 详解

简述

  lombok可以通过注解的方式,帮我们简化java类中诸如Getter,Setter,ToString等臃肿但是又必须的方法书写。

Lombok依赖

  https://mvnrepository.com/artifact/org.projectlombok/lombok

  这里使用lombok的1.18.22版本

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.22'
}

  注意如果gradle版本在5.0以上会构建失败,正确的姿势应该是:

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.22'
    annotationProcessor 'org.projectlombok:lombok:1.18.22'
    testCompileOnly 'org.projectlombok:lombok:1.18.22'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
}

  原因详见https://cloud.tencent.com/developer/article/1480194

IDEA的lombok插件

  Intellij IDEA 2020.3之后 Lombok 已经成为内置插件,不需要自行安装

  以前版本可以在插件市场进行安装

  在idea设置栏选中启用Annotation Processors

Lombok注解

  常用注解

@Data 最常用的注解,注解在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor
@Setter 作用于属性上,为该属性提供setter方法; 作用与类上,为该类所有的属性提供setter方法
@Getter 作用和Setter相似,生成Getter方法
@AllArgsConstructor 作用于类上,为该类提供一个包含全部参的构造方法,注意此时默认构造方法不会提供。
@NoArgsConstructor 作用于类上,提供一个无参的构造方法。可以和@AllArgsConstructor同时使用,此时会生成两个构造方法:无参构造方法和全参构造方法。
@NonNull 作用于属性上,提供关于此参数的非空检查,如果参数为空,则抛出空指针异常。
@Log4j 作用于类上,为该类提供一个属性名为log的log4j日志对象。

@Data

  例如我在一个java上添置了@Data注解

package com.hjj;
import lombok.Data;

@Data
public class Student {
    private String name;
    private Integer age;
}

  编译后可以看到生成了setter/getter、equals、canEqual、hashCode、toString方法

  注意@Data注解没有生成带参构造函数,如果需要生成要用@AllArgsConstructor注解

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.hjj;

public class Student {
    private String name;
    private Integer age;

    public Student() {
    }

    public String getName() {
        return this.name;
    }

    public Integer getAge() {
        return this.age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof Student)) {
            return false;
        } else {
            Student other = (Student)o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                Object this$name = this.getName();
                Object other$name = other.getName();
                if (this$name == null) {
                    if (other$name != null) {
                        return false;
                    }
                } else if (!this$name.equals(other$name)) {
                    return false;
                }

                Object this$age = this.getAge();
                Object other$age = other.getAge();
                if (this$age == null) {
                    if (other$age != null) {
                        return false;
                    }
                } else if (!this$age.equals(other$age)) {
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(Object other) {
        return other instanceof Student;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $name = this.getName();
        int result = result * 59 + ($name == null ? 43 : $name.hashCode());
        Object $age = this.getAge();
        result = result * 59 + ($age == null ? 43 : $age.hashCode());
        return result;
    }

    public String toString() {
        String var10000 = this.getName();
        return "Student(name=" + var10000 + ", age=" + this.getAge() + ")";
    }
}
Student类编译后

@NonNull

  非常好用,在参数上使用后,构造函数中如果传入null给此参数会报错

  例如我在Student类的name参数加了@NonNull

package com.hjj;

import lombok.Data;
import lombok.NonNull;

@Data
public class Student {
    @NonNull
    private String name;
    private Integer age;
}

  编译后的构造函数则为

public Student(@NonNull String name) {
    if (name == null) {
        throw new NullPointerException("name is marked @NonNull but is null");
    } else {
        this.name = name;
    }
}

  可以看到name参数做了判空处理

@Log4j

  使用此注解需同样引入slf4j的依赖

  @Log4j注解会生成一个log常量供我们使用

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

@Data
@Slf4j
public class Student {
    private String name;
    private Integer age;
}

  生成的代码为

public class Student {
  private static final Logger log = LoggerFactory.getLogger(Student.class);
  ...
}

References

  https://cloud.tencent.com/developer/article/1480194

  https://blog.csdn.net/ThinkWon/article/details/101392808

  https://blog.csdn.net/cauchy6317/article/details/102567195

posted @ 2022-10-21 00:58  艾尔夏尔-Layton  阅读(69)  评论(0编辑  收藏  举报