从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • JavaSE

  • JavaSenior

  • JavaEE

  • JavaWeb

  • Spring

  • 主流框架

    • Redis

    • Mybatis

    • Lucene

    • Elasticsearch

    • MQ

    • MyCat

    • Lombok

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

  • SpringBoot

  • Java并发

  • Java源码

  • JVM

  • 韩顺平

  • Java
  • 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,读者可以通过切换分支来查看本文的示例代码

‍

在GitHub上编辑此页 (opens new window)
上次更新: 2023/7/11 10:04:34
Lombok简介
深入Lombok

← Lombok简介 深入Lombok→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式