lombok学习笔记

lombok

介绍

lombok是一个开源的代码生成库,能以简单的注解形式来简化Java类中的大量样板代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量。

lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法,使代码看起来更简洁。

lombok对应的maven坐标:

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

安装lombok插件

要使用lombok需要在IDE中安装对应的lombok插件。本课程使用的开发工具为IntelliJ IDEA,安装插件过程如下:

1、打开IntelliJ IDEA后点击菜单栏中的File–>Settings进入到设置页面

2、点击设置页面中的Plugins进行插件的安装,在右侧选择Browse repositories…,然后在搜索页面输入lombok,可以查询到下方的Lombok Plugin,鼠标点击Lombok Plugin可在右侧看到Install按钮,点击该按钮便可安装

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5YjWAyJa-1666791380397)(img/lombok学习笔记/image-20221025223548417.png)]

lombok常用注解

注解说明
@Setter注解在类或属性,注解在类时为所有属性生成setter方法,注解在属性上时只为该属性生成setter方法
@Getter使用方法同@Setter,区别在于生成的是getter方法
@ToString注解在类,添加toString方法
@EqualsAndHashCode注解在类,生成hashCode和equals方法
@NoArgsConstructor注解在类,生成无参的构造方法
@RequiredArgsConstructor注解在类,为类中需要特殊处理的属性生成构造方法,比如final和被@NonNull注解的属性
@AllArgsConstructor注解在类,生成包含类中所有属性的构造方法
@Data注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法
@Slf4j注解在类,生成log变量,用于记录日志
@Builder将类转变为建造者模式

示例

第一步:创建工程lombok_use_demo

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D5t6vPnl-1666791380398)(img/lombok学习笔记/image-20221025223958416.png)]

第二步:更改pom文件,导入lombok依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>mao</groupId>
    <artifactId>lombok_use_demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>lombok_use_demo</name>
    <description>lombok_use_demo</description>
    
    <properties>
        <java.version>11</java.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--spring-boot lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

第三步:创建Student实体类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JZ3j4PCn-1666791380399)(img/lombok学习笔记/image-20221025224417601.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lotjFjW3-1666791380400)(img/lombok学习笔记/image-20221025224637887.png)]

package mao.lombok_use_demo.entity;

import java.util.Date;

/**
 * Project name(项目名称):lombok_use_demo
 * Package(包名): mao.lombok_use_demo.entity
 * Class(类名): Student
 * Author(作者): mao
 * Author QQ:1296193245
 * GitHub:https://github.com/maomao124/
 * Date(创建日期): 2022/10/25
 * Time(创建时间): 22:44
 * Version(版本): 1.0
 * Description(描述): 无
 */

public class Student
{
    /**
     * id
     */
    private long id;
    /**
     * 名字
     */
    private String name;
    /**
     * 性
     */
    private String sex;
    /**
     * 年龄
     */
    private int age;
    /**
     * 地址
     */
    private String address;

    /**
     * 电话
     */
    private String phone;

    /**
     * 创建时间
     */
    private Date createTime;
    
}

第四步:加入lombok提供的注解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aAhHBVV5-1666791380400)(img/lombok学习笔记/image-20221025224808831.png)]

package mao.lombok_use_demo.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * Project name(项目名称):lombok_use_demo
 * Package(包名): mao.lombok_use_demo.entity
 * Class(类名): Student
 * Author(作者): mao
 * Author QQ:1296193245
 * GitHub:https://github.com/maomao124/
 * Date(创建日期): 2022/10/25
 * Time(创建时间): 22:44
 * Version(版本): 1.0
 * Description(描述): 无
 */

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Student
{
    /**
     * id
     */
    private long id;
    /**
     * 名字
     */
    private String name;
    /**
     * 性
     */
    private String sex;
    /**
     * 年龄
     */
    private int age;
    /**
     * 地址
     */
    private String address;

    /**
     * 电话
     */
    private String phone;

    /**
     * 创建时间
     */
    private Date createTime;

}

第五步:测试

加入日志注解@Slf4j

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uBu6fEIJ-1666791380401)(img/lombok学习笔记/image-20221025224951152.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FTxFyGm9-1666791380402)(img/lombok学习笔记/image-20221025225101197.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-msPfqKhV-1666791380402)(img/lombok学习笔记/image-20221025225217708.png)]

测试1:

package mao.lombok_use_demo;

import lombok.extern.slf4j.Slf4j;
import mao.lombok_use_demo.entity.Student;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
@Slf4j
class LombokUseDemoApplicationTests
{

    @Test
    void contextLoads()
    {
    }

    @Test
    void test1()
    {
        Student student=new Student();
        student.setId(2L);
        student.setName("张三");
        student.setAge(18);
        log.info(student.toString());
    }
}
2022-10-25 22:52:49.742  INFO 19916 --- [           main] m.l.LombokUseDemoApplicationTests        : Student(id=2, name=张三, sex=null, age=18, address=null, phone=null, createTime=null)

测试2:

package mao.lombok_use_demo;

import lombok.extern.slf4j.Slf4j;
import mao.lombok_use_demo.entity.Student;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
@Slf4j
class LombokUseDemoApplicationTests
{

    @Test
    void contextLoads()
    {
    }

    @Test
    void test1()
    {
        Student student = new Student();
        student.setId(2L);
        student.setName("张三");
        student.setAge(18);
        log.info(student.toString());
    }

    @Test
    void test2()
    {
        Student student = new Student();
        student.setId(2L);
        student.setName("张三");
        student.setAge(18);
        log.info(student.getName());
    }
}
2022-10-25 22:53:58.174  INFO 19016 --- [           main] m.l.LombokUseDemoApplicationTests        : 张三

测试3:

package mao.lombok_use_demo;

import lombok.extern.slf4j.Slf4j;
import mao.lombok_use_demo.entity.Student;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
@Slf4j
class LombokUseDemoApplicationTests
{

    @Test
    void contextLoads()
    {
    }

    /**
     * test1 ,测试set方法和toString方法
     */
    @Test
    void test1()
    {
        Student student = new Student();
        student.setId(2L);
        student.setName("张三");
        student.setAge(18);
        log.info(student.toString());
    }

    /**
     * test2,测试get方法
     */
    @Test
    void test2()
    {
        Student student = new Student();
        student.setId(2L);
        student.setName("张三");
        student.setAge(18);
        log.info(student.getName());
    }

    /**
     * test3 ,测试equals和hashcode方法
     */
    @Test
    void test3()
    {
        Student student1 = new Student();
        student1.setId(2L);
        student1.setName("张三");
        student1.setAge(18);

        Student student2 = new Student();
        student2.setId(2L);
        student2.setName("张三");
        student2.setAge(19);

        Student student3 = new Student();
        student3.setId(2L);
        student3.setName("张三");
        student3.setAge(18);

        log.info("student1 equals student2:" + student1.equals(student2));
        log.info("student1 equals student3:" + student1.equals(student3));

        log.info("student1 hashcode:" + student1.hashCode());
        log.info("student2 hashcode:" + student2.hashCode());
        log.info("student3 hashcode:" + student3.hashCode());

    }
}

2022-10-25 22:57:09.792  INFO 18892 --- [           main] m.l.LombokUseDemoApplicationTests        : student1 equals student2:false
2022-10-25 22:57:09.792  INFO 18892 --- [           main] m.l.LombokUseDemoApplicationTests        : student1 equals student3:true
2022-10-25 22:57:09.792  INFO 18892 --- [           main] m.l.LombokUseDemoApplicationTests        : student1 hashcode:1131099724
2022-10-25 22:57:09.793  INFO 18892 --- [           main] m.l.LombokUseDemoApplicationTests        : student2 hashcode:1846024023
2022-10-25 22:57:09.793  INFO 18892 --- [           main] m.l.LombokUseDemoApplicationTests        : student3 hashcode:1131099724

测试4:

package mao.lombok_use_demo;

import lombok.extern.slf4j.Slf4j;
import mao.lombok_use_demo.entity.Student;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;

@SpringBootTest
@Slf4j
class LombokUseDemoApplicationTests
{

    @Test
    void contextLoads()
    {
    }

    /**
     * test1 ,测试set方法和toString方法
     */
    @Test
    void test1()
    {
        Student student = new Student();
        student.setId(2L);
        student.setName("张三");
        student.setAge(18);
        log.info(student.toString());
    }

    /**
     * test2,测试get方法
     */
    @Test
    void test2()
    {
        Student student = new Student();
        student.setId(2L);
        student.setName("张三");
        student.setAge(18);
        log.info(student.getName());
    }

    /**
     * test3 ,测试equals和hashcode方法
     */
    @Test
    void test3()
    {
        Student student1 = new Student();
        student1.setId(2L);
        student1.setName("张三");
        student1.setAge(18);

        Student student2 = new Student();
        student2.setId(2L);
        student2.setName("张三");
        student2.setAge(19);

        Student student3 = new Student();
        student3.setId(2L);
        student3.setName("张三");
        student3.setAge(18);

        log.info("student1 equals student2:" + student1.equals(student2));
        log.info("student1 equals student3:" + student1.equals(student3));

        log.info("student1 hashcode:" + student1.hashCode());
        log.info("student2 hashcode:" + student2.hashCode());
        log.info("student3 hashcode:" + student3.hashCode());

    }

    /**
     * test4,测试所有参数的构造方法
     */
    @Test
    void test4()
    {
        Student student = new Student(2009L, "李四", "女", 18, null, "18888888888", new Date());
        log.info(student.toString());
    }
}
2022-10-25 23:00:22.367  INFO 16072 --- [           main] m.l.LombokUseDemoApplicationTests        : Student(id=2009, name=李四, sex=女, age=18, address=null, phone=18888888888, createTime=Tue Oct 25 23:00:22 CST 2022)

测试5:

package mao.lombok_use_demo;

import lombok.extern.slf4j.Slf4j;
import mao.lombok_use_demo.entity.Student;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;

@SpringBootTest
@Slf4j
class LombokUseDemoApplicationTests
{

    @Test
    void contextLoads()
    {
    }

    /**
     * test1 ,测试set方法和toString方法
     */
    @Test
    void test1()
    {
        Student student = new Student();
        student.setId(2L);
        student.setName("张三");
        student.setAge(18);
        log.info(student.toString());
    }

    /**
     * test2,测试get方法
     */
    @Test
    void test2()
    {
        Student student = new Student();
        student.setId(2L);
        student.setName("张三");
        student.setAge(18);
        log.info(student.getName());
    }

    /**
     * test3 ,测试equals和hashcode方法
     */
    @Test
    void test3()
    {
        Student student1 = new Student();
        student1.setId(2L);
        student1.setName("张三");
        student1.setAge(18);

        Student student2 = new Student();
        student2.setId(2L);
        student2.setName("张三");
        student2.setAge(19);

        Student student3 = new Student();
        student3.setId(2L);
        student3.setName("张三");
        student3.setAge(18);

        log.info("student1 equals student2:" + student1.equals(student2));
        log.info("student1 equals student3:" + student1.equals(student3));

        log.info("student1 hashcode:" + student1.hashCode());
        log.info("student2 hashcode:" + student2.hashCode());
        log.info("student3 hashcode:" + student3.hashCode());

    }

    /**
     * test4,测试所有参数的构造方法
     */
    @Test
    void test4()
    {
        Student student = new Student(2009L, "李四", "女", 18, null, "18888888888", new Date());
        log.info(student.toString());
    }


    /**
     * test5
     */
    @Test
    void test5()
    {
        Student student = Student.builder().id(12L).name("张三").phone("1666666666").build();
        log.info(student.toString());
    }
}
2022-10-25 23:03:05.236  INFO 16048 --- [           main] m.l.LombokUseDemoApplicationTests        : Student(id=12, name=张三, sex=null, age=0, address=null, phone=1666666666, createTime=null)

反编译

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JjW3XhvD-1666791380402)(img/lombok学习笔记/image-20221025230540226.png)]

从target目录里找到对应的实体类,反编译

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

package mao.lombok_use_demo.entity;

import java.util.Date;

public class Student {
    private long id;
    private String name;
    private String sex;
    private int age;
    private String address;
    private String phone;
    private Date createTime;

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

    public long getId() {
        return this.id;
    }

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

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

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

    public String getAddress() {
        return this.address;
    }

    public String getPhone() {
        return this.phone;
    }

    public Date getCreateTime() {
        return this.createTime;
    }

    public void setId(final long id) {
        this.id = id;
    }

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

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

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

    public void setAddress(final String address) {
        this.address = address;
    }

    public void setPhone(final String phone) {
        this.phone = phone;
    }

    public void setCreateTime(final Date createTime) {
        this.createTime = createTime;
    }

    public boolean equals(final 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.getId() != other.getId()) {
                return false;
            } else if (this.getAge() != other.getAge()) {
                return false;
            } else {
                label76: {
                    Object this$name = this.getName();
                    Object other$name = other.getName();
                    if (this$name == null) {
                        if (other$name == null) {
                            break label76;
                        }
                    } else if (this$name.equals(other$name)) {
                        break label76;
                    }

                    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;
                }

                label62: {
                    Object this$address = this.getAddress();
                    Object other$address = other.getAddress();
                    if (this$address == null) {
                        if (other$address == null) {
                            break label62;
                        }
                    } else if (this$address.equals(other$address)) {
                        break label62;
                    }

                    return false;
                }

                label55: {
                    Object this$phone = this.getPhone();
                    Object other$phone = other.getPhone();
                    if (this$phone == null) {
                        if (other$phone == null) {
                            break label55;
                        }
                    } else if (this$phone.equals(other$phone)) {
                        break label55;
                    }

                    return false;
                }

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

                return true;
            }
        }
    }

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

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        long $id = this.getId();
        int result = result * 59 + (int)($id >>> 32 ^ $id);
        result = result * 59 + this.getAge();
        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 $address = this.getAddress();
        result = result * 59 + ($address == null ? 43 : $address.hashCode());
        Object $phone = this.getPhone();
        result = result * 59 + ($phone == null ? 43 : $phone.hashCode());
        Object $createTime = this.getCreateTime();
        result = result * 59 + ($createTime == null ? 43 : $createTime.hashCode());
        return result;
    }

    public String toString() {
        long var10000 = this.getId();
        return "Student(id=" + var10000 + ", name=" + this.getName() + ", sex=" + this.getSex() + ", age=" + this.getAge() + ", address=" + this.getAddress() + ", phone=" + this.getPhone() + ", createTime=" + this.getCreateTime() + ")";
    }

    public Student() {
    }

    public Student(final long id, final String name, final String sex, final int age, final String address, final String phone, final Date createTime) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.address = address;
        this.phone = phone;
        this.createTime = createTime;
    }

    public static class StudentBuilder {
        private long id;
        private String name;
        private String sex;
        private int age;
        private String address;
        private String phone;
        private Date createTime;

        StudentBuilder() {
        }

        public Student.StudentBuilder id(final long id) {
            this.id = id;
            return this;
        }

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

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

        public Student.StudentBuilder age(final int age) {
            this.age = age;
            return this;
        }

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

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

        public Student.StudentBuilder createTime(final Date createTime) {
            this.createTime = createTime;
            return this;
        }

        public Student build() {
            return new Student(this.id, this.name, this.sex, this.age, this.address, this.phone, this.createTime);
        }

        public String toString() {
            return "Student.StudentBuilder(id=" + this.id + ", name=" + this.name + ", sex=" + this.sex + ", age=" + this.age + ", address=" + this.address + ", phone=" + this.phone + ", createTime=" + this.createTime + ")";
        }
    }
}

end


by mao

2022 10 26


        this.age = age;
        return this;
    }

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

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

    public Student.StudentBuilder createTime(final Date createTime) {
        this.createTime = createTime;
        return this;
    }

    public Student build() {
        return new Student(this.id, this.name, this.sex, this.age, this.address, this.phone, this.createTime);
    }

    public String toString() {
        return "Student.StudentBuilder(id=" + this.id + ", name=" + this.name + ", sex=" + this.sex + ", age=" + this.age + ", address=" + this.address + ", phone=" + this.phone + ", createTime=" + this.createTime + ")";
    }
}

}






















---

end

---

by mao

2022  10  26

---

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值