从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • JavaSE

  • JavaSenior

  • JavaEE

  • JavaWeb

  • Spring

  • 主流框架

    • Redis

    • Mybatis

    • Lucene

    • Elasticsearch

    • MQ

    • MyCat

    • Lombok

      • Lombok 简介
      • Lombok 常用注解
        • 关于 get/set 的注解
        • 关于 toString 方法的注解
        • 关于判空的注解
        • 关于构造函数的注解
        • 关于 equals 和 hashcode 的注解
        • 综合注解
        • 更多注解
        • 源码
      • 深入 Lombok
  • SpringMVC

  • SpringBoot

  • Java
  • 主流框架
  • Lombok
2023-07-11
目录

Lombok 常用注解

# 20.Lombok 常用注解

本文讲解更多关于 Lombok 的常用注解 ‍

# 关于 get/set 的注解

  • @Setter:生成 setter 方法
  • @Getter:生成 getter 方法

以@Getter 为例,其类定义如下:

@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Getter {
1
2
3

@Target 的取值说明,我们可以将这两个注解,用在类和成员变量上。

  • 用在类上的时候,就是所有成员变量都生成 setter 和 getter 方法;
  • 而用在成员变量上的时候,就只有该成员变量会生成 setter 和 getter。 ‍

# 关于 toString 方法的注解

@ToString 注解能自动生成 toString 方法,比如之前我们是这样打印对象:

@Override
public String toString() {
    return "User{" +
            "name='" + name + '\'' +
            ", email='" + email + '\'' +
            ", password='" + password + '\'' +
            '}';
}
1
2
3
4
5
6
7
8

‍ 加上注解后:

@Getter
@Setter
@ToString
public class User2 {
    private String name;
    private String email;
    private String password;
}
1
2
3
4
5
6
7
8

‍ 测试:

package com.peterjxl;

public class TestToString {
    public static void main(String[] args) {
        User2 user = new User2();
        user.setName("Peter");
        user.setEmail("peterjxl@qq.com");
        user.setPassword("123456");
        System.out.println(user);
    }
}
1
2
3
4
5
6
7
8
9
10
11

‍ 运行结果:

User2(name=Peter, email=peterjxl@qq.com, password=123456)
1

# 关于判空的注解

@NonNull 做 空指针判断。该注解作用在方法参数上,用于自动生成空值参数检查,比如之前我们是这样判空的(第 9 行):

package com.peterjxl;

public class TestNonNull {
    public static void main(String[] args) {
        testNonNull(null);
    }

    public static void testNonNull(String name) {
        if(null == name) {
            throw new NullPointerException("name is null");
        }
        System.out.println(name);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

‍ 使用了注解之后(第 17 行):

package com.peterjxl;
import lombok.NonNull;

public class TestNonNull {
    public static void main(String[] args) {
        // testNonNull(null);
        testNonNull2(null);
    }

    public static void testNonNull(String name) {
        if(null == name) {
            throw new NullPointerException("name is null");
        }
        System.out.println(name);
    }

    public static void testNonNull2(@NonNull String name) {
        System.out.println(name);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

‍ 运行结果:

Exception in thread "main" java.lang.NullPointerException: name is marked non-null but is null
	at com.peterjxl.TestNonNull.testNonNull2(TestNonNull.java:18)
	at com.peterjxl.TestNonNull.main(TestNonNull.java:8)
1
2
3

# 关于构造函数的注解

  • @AllArgsConstructor:全参构造方法
  • @NoArgsConstructor:无参构造方法
  • @RequiredArgsConstructor:部分参数构造方法,为所有 final 和 @NonNull 修饰的字段生成一个构造方法,这里不展开 ‍ 测试:在 User2 上添加注解
package com.peterjxl;

import lombok.*;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User2 {
    private String name;
    private String email;
    private String password;
}
1
2
3
4
5
6
7
8
9
10
11
12
13

‍ 然后调用它们:

package com.peterjxl;

public class TestConstructor {
    public static void main(String[] args) {
        User2 user = new User2();
        User2 user2 = new User2("Peter", "peterjxl@qq.com", "123456");

        System.out.println(user);
        System.out.println(user2);
    }
}
1
2
3
4
5
6
7
8
9
10
11

‍ 输出:

User2(name=null, email=null, password=null)
User2(name=Peter, email=peterjxl@qq.com, password=123456)
1
2

# 关于 equals 和 hashcode 的注解

@EqualsAndHashCode,可以帮我们生成 equals 和 hashcode 注解。

加上:

package com.peterjxl;

import lombok.*;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class User2 {
    private String name;
    private String email;
    private String password;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

‍ 测试:

package com.peterjxl;

public class TestEqualsAndHashCode {
    public static void main(String[] args) {
        User2 user = new User2();
        user.setName("Peter");
        user.setEmail("peterjxl@qq.com");
        user.setPassword("123456");

        System.out.println(user.getName());
        System.out.println(user);
        System.out.println(user.hashCode());

        User2 user2 = new User2();
        user2.setName("Peter");
        user2.setEmail("peterjxl@qq.com");
        user2.setPassword("123456");
        System.out.println(user.equals(user2));
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

‍ 输出:

Peter
User2(name=Peter, email=peterjxl@qq.com, password=123456)
1764516877
true
1
2
3
4

‍

# 综合注解

@Data 注解只能作用在类上,其相当于多个注解:@Getter/@Setter,@ToString/@EqualsAndHashCode ‍ 源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
1
2
3

测试:新建一个 User3

package com.peterjxl;

import lombok.Data;

@Data
public class User3 {
    private String name;
    private String email;
    private String password;
}
1
2
3
4
5
6
7
8
9
10

‍ 调用:

package com.peterjx;

public class TestData {
    public static void main(String[] args) {
        User3 user = new User3();
        user.setName("Peter");
        user.setEmail("peterjxl@qq.com");
        user.setPassword("123456");

        System.out.println(user.getName());
        System.out.println(user);
        System.out.println(user.hashCode());

        User3 user2 = new User3();
        user2.setName("Peter");
        user2.setEmail("peterjxl@qq.com");
        user2.setPassword("123456");
        System.out.println(user.equals(user2));
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

‍ 输出结果:

Peter
User3(name=Peter, email=peterjxl@qq.com, password=123456)
1764516877
true
1
2
3
4

‍

# 更多注解

受限于篇幅限制,只介绍了一些常用的注解。除此之外,还有:

  • @Builder:可以通过链式表达的方式创建对象
  • @Cleanup:作用在变量上,可以自动关闭资源(替换 try-close)
  • @SneakyThrows:作用在方法上,用于抛出异常。例如一个 IO 的方法,要抛出 IO 的异常,使用该注解后就不用写了。
  • @Log:为类自动生成 log 日志记录
  • @Synchronized:为类方法或实例方法自动生成 synchronized 保护
  • ...............

# 源码

已将本文源码上传到 Gitee (opens new window) 或 GitHub (opens new window) 的分支 demo2,读者可以通过切换分支来查看本文的示例代码 ‍

上次更新: 2025/6/3 09:31:54
Lombok 简介
深入 Lombok

← Lombok 简介 深入 Lombok→

最近更新
01
学点统计学:轻松识破一本正经的胡说八道
06-05
02
2025 年 5 月记
05-31
03
《贫穷的本质》很棒,但可能不适合你
05-27
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式