lombok常用的注解学习笔记

目录标题

一、lombok是什么?

lombok是一种java的使用工具,可以用来帮助开发人员消除java中的冗长代码,尤其是对于简单的java对象(pojo),他通过注解实现这一目的。

二、lombok在idea中的使用

1、需要在idea中安装lombok插件然后重启
2、在pom文件中引入对应的依赖

 <!--    lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
            <scope>provided</scope>
        </dependency>

三、lombok的常用注解

1、@Getter和@Setter

这两个注释可以注释在类上面,也可以注释在字段上面,这两个注释就是可以减少get和set方法的手动书写,当然在注释后面可以添加参数,可以说明这个字段或者类的级别,比如@Getter(AccessLevel.PROTECTED)就是说明它是protected级别的
如果在一个类上面注释了这两个注解是,可是你又希望有一个字段不会生成get和set方法是,可以在你希望不会的生成的字段上注释@Getter(AccessLevel.NONE),get同理,这个会把该字段的保护起来,不会生成这两个方法
特别注意的是如果一个字段有静态修饰词static是不会生成这两个方法,还是final修饰时,不会生成set方法。
下面是.java文件以及生成的.class文件

.java文件

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

/**
 * @author weiguorong
 * @date 2021/2/12 16:22
 */
@Getter
@Setter
public class Student {

    static int id;
    final int id2 = 10;
    private String name;
    @Setter(AccessLevel.PRIVATE)
    private String sex;
    @Setter(AccessLevel.NONE)
    @Getter(AccessLevel.NONE)
    private String email;

}

生成的.class文件

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

public class Student {
    static int id;
    final int id2 = 10;
    private String name;
    private String sex;
    private String email;

    public Student() {
    }

    public int getId2() {
        this.getClass();
        return 10;
    }

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

    public String getSex() {
        return this.sex;
    }

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

    private void setSex(String sex) {
        this.sex = sex;
    }
}

2、@ToString

这个注解不支持在字段上,只能在类上,顾名思义就是生成toSting方法,在这边要注意的是该注解的有两种参数,exclude和of
用法如下@ToString(exclude = {“email”},of = {“name”}),exclude是除了大括号里的值,其他都有,而of只有大括号里的值

3、@EqualsAndHashCode

这个注解生成了equals、canEqual、hashCode三个方法,它个@ToString一样有exclude和of两个参数,用法也跟它一样

4、@NonNull

@NonNull这个注解可以用在字段上,也可以用在方法的参数上,作用是自动帮你判断是否是null,如果是null,就会报空指针异常,

5、@NoArgsConstructor、@RequiredArgsConstructor和@AllArgsConstructor

这三个注解都是生成构造函数的,@NoArgsConstructor是无参的构造函数,
@RequiredArgsConstructor是构造有@NonNull修饰的字段或者是final修饰的字段的构造方法,@AllArgsConstructor则是所有的字段的构造函数

6、@Data

@Data注解集成了@Getter和@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor这几个注解与一身,是一个非常强大的注解,这个注解更可以简化注解的代码量

7、@Builder

@Builder注解会生成一个Builder内部类,使用的赋值操作会比之前更加方便,具体我把代码放下面
.java文件

import lombok.*;

/**
 * @author weiguorong
 * @date 2021/2/12 16:22
 */
@Data
@Builder
public class Student {

    static int id;
    final int id2 = 10;
    private String name;
    @Setter(AccessLevel.PRIVATE)
    private String sex;
    @Setter(AccessLevel.NONE)
    @Getter(AccessLevel.NONE)
    private String email;

    public static void main(String[] args) {
        Student student = Student.builder()
                .email("123")
                .sex("男")
                .name("萧炎")
                .build();
        System.out.println(student.toString());
    }
}

生成的.class文件

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

public class Student {
    static int id;
    final int id2 = 10;
    private String name;
    private String sex;
    private String email;

    public static void main(String[] args) {
        Student student = builder().email("123").sex("男").name("萧炎").build();
        System.out.println(student.toString());
    }

    Student(String name, String sex, String email) {
        this.name = name;
        this.sex = sex;
        this.email = email;
    }

    public static Student.StudentBuilder builder() {
        return new Student.StudentBuilder();
    }

    public int getId2() {
        this.getClass();
        return 10;
    }

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

    public String getSex() {
        return this.sex;
    }

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

    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 if (this.getId2() != other.getId2()) {
                return false;
            } else {
                label49: {
                    Object this$name = this.getName();
                    Object other$name = other.getName();
                    if (this$name == null) {
                        if (other$name == null) {
                            break label49;
                        }
                    } else if (this$name.equals(other$name)) {
                        break label49;
                    }

                    return false;
                }

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

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

                return true;
            }
        }
    }

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

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

    public String toString() {
        return "Student(id2=" + this.getId2() + ", name=" + this.getName() + ", sex=" + this.getSex() + ", email=" + this.email + ")";
    }

    private void setSex(String sex) {
        this.sex = sex;
    }

    public static class StudentBuilder {
        private String name;
        private String sex;
        private String email;

        StudentBuilder() {
        }

        public Student.StudentBuilder name(String name) {
            this.name = name;
            return this;
        }

        public Student.StudentBuilder sex(String sex) {
            this.sex = sex;
            return this;
        }

        public Student.StudentBuilder email(String email) {
            this.email = email;
            return this;
        }

        public Student build() {
            return new Student(this.name, this.sex, this.email);
        }

        public String toString() {
            return "Student.StudentBuilder(name=" + this.name + ", sex=" + this.sex + ", email=" + this.email + ")";
        }
    }
}

注意看.java文件的mian方法中的赋值,这样的链式赋值相比之前更方便简洁,控制台的输出如下:
lombok常用的注解学习笔记

8、@Log

@Log注解也是简化了日志,可以通过注解直接获取到日志

9、val

这不是一个注解,它就相当于前端的var一样,比如java中本来书写的Map<String,String> map = new HashMap<String,String>();可以书写成val map = new HashMap<String,String>();虽然是这样书写的,但是最后生成的类型还是Map<String,String>

10、@Cleanup

该注解标记与文件流对象上,可以解决文件流对象对异常的捕捉和文件流的关闭的繁琐代码

上一篇:idea使用lombok


下一篇:mybatis 多对一查询的两种实现方式