Lombok 常用注解

1. @Constructor 注解

@Constructor 注解标注于类上,用于生成类的构造函数。它一共有三种:

还有其它的包、库自定义了 @NonNull 注解,注意你 import 的是哪一个。

另外,@AllArgsContructor 和 @RequiredArgsConstructor 可以使用一个叫 staticName

的属性用于生成对象的静态构造方法。 这个方法通常叫 of 或 getInstance 。

java 复制代码
1.  @AllArgsConstructor(staticName = "of")
2.  public class Human { ... }
3.
4.  Human human = Human.of(name, age);

2. @Builder 注解

@Builder 同样是用于构造对象。它标注于类上,用于在类中生成该类的一个 Builder,以便

使用 Builder 方式以链式的方式实例化对象。

java 复制代码
1.  @Builder
2.  public class Human { ... }
3.
4.  Human h = Human.builder().name(name).age(age).build();

通常的编码习惯是在使用 Builder 时多折行显示,形如:

java 复制代码
1.  Human h = Human.builder()
2.  .name(name)
3.  .age(age)
4.  ...
5.  .build();

::: details @Builder 注解的内部逻辑

示例

java 复制代码
public class Department
2.  {
3.  private Integer deptno;
4.  private String dname;;
5.  private String loc;
6.
7.  public Department() {
8.  super();
9.  }
10.
11.  public Department(Builder builder) {
12.  this.deptno = builder.deptno;
13.  this.dname = builder.dname;
14.  this.loc = builder.loc;
15.  }
16.
17.  public Integer getDeptno() {
18.  return deptno;
19.  }
20.
21.  public String getDname() {
22.  return dname;
23.  }
24.
25.  public String getLoc() {
26.  return loc;
27.  }
28.
29.  /**
30.  * Department 的静态内部类,成员变量和 Department 的一致
31.  */
32.  public static class Builder {
33.  private Integer deptno; // 可选属性
34.  private final String dname; // 必选,final 类型需要在构造器中初始化
,不允许不初始化它的构造器存在
35.  private String loc; // 可选
36.
37.  /**
38.  * 含必选参数的构造方法
39.  */
40.  public Builder(String dname) {
41.  this.dname = dname;
42.  }
43.
44.  public Builder deptno(Integer deptno) {
45.  this.deptno = deptno;
46.  return this;
47.  }
48.
49.  public Builder loc(String loc) {
50.  this.loc = loc;
51.  return this;
52.  }
53.
54.  /**
55.  * 最终构建方法,返回一个 Department 对象,参数是当前 Builder 对象
56.  */
57.  public Department build() {
58.  return new Department(this);
59.  }
60.  }
61.
62.  }

3. @Getter / @Setter 注解

在属性上标注,即生成该属性的 getter/setter 方法。

在类上标注,则是为该类的『所有属性』生成 getter/setter 方法。

@Getter / @Setter 注解有一个 value 属性 (默认属性) 可以设置所生成的 getter/setter 方

法的访问权限。默认为 lombok.AccessLevel.PUBLIC 。

java 复制代码
  @Getter(lombok.AccessLevel.PROTECTED

::: warning 注意

这里有一个 lombok 的『著名的坑』:对于基本类型 boolean 和它的包装类 Boolean

,@Getter 注解所生成的方法名的名字不一样!

java 复制代码
1.  private boolean male; // 生成 isMale() 方法
2.  private Boolean male; // 生成 getMale() 方法

4. @ToString 注解

@ToString 注解标注于类上,用于生成 toString 方法。

默认的 toString 格式为:ClassName(fieldName=fieleValue, fieldName1=fieleValue,...)

如果想排除某些属性 (特别是因为循环引用问题) 时,可以使用 exclude 属性。

java 复制代码
1.  @ToString(exclude = { "id", ... })
2.  public class Human { ... }

如果因为继承,你想要在 toSting 方法中包括继承自父类的属性,那么可以使用 callSuper

属性。

java 复制代码
1.  @ToString(callSuper = true) // 默认值是 false
2.  public class Human { ... }

如果为了简化内容,你可以使用 includeFieldNames 属性在 toString 方法中去掉属性的名

字。

java 复制代码
1.  @ToString(includeFieldNames = false) // 默认值是 true
2.  public class Human { ... }

5. @EqualsAndHashCode 注解

@EqualsAndHashCode 注解标注于类上,用于生成 equals 方法和 hashCode 方法。

和之前的 @ToString 一样,可是使用 exclude 选项除掉不想要的属性。也可以通过

callSuper 包含父类的 equals 和 hashCode 。

需要注意的是,如果类的属性中有 Array(数组)类型的变量,最好是『手写』equals

和 hashCode 方法。因为最好是调用工具类 Arrays 中的 deepHashCode 方法,

deepEquals 方法进行比较。

6. @Data 注解

java 复制代码
1.  @Data
2.  = @ToString
3.  + @EqualsAndHashCode
4.  + @Getter
5.  + @Setter
6.  + @RequiredArgsConstrutor

@Data 注解标注于类上,一个顶 5 个,对于 JavaBean 类十分有用。

另外,@Value 注解是 @Data 的不可变形式,相当于为属性添加 final 声明,只提供 getter

方法,而不提供 setter 方法。即,使用它的 JavaBean 都是「只读」的 JavaBean 。

::: tip 提示

通常,对于一个 JavaBean 的定义,如果没有特殊要求,一般惯例都是如下 3 个注解:

java 复制代码
1.  @Data
2.  @NoArgsConstructor
3.  @Builder
4.  public class Student {
5.      ...
6.  }

7. @Slf4j 注解

自动实例化日志对象 log 。

pom 依赖:

XML 复制代码
1.  <!-- 自动依赖 slf4j-api -->
2.  <dependency>
3.      <groupId>ch.qos.logback</groupId>
4.      <artifactId>logback-classic</artifactId>
5.      <version>1.2.3</version>
6.  </dependency>

需要将日志的配置文件 (logback.xml) 放置到 classpath 下。

在类上标注 @Slf4j

java 复制代码
1.  @Slf4j
2.  public class App { ... }

使用 log 对象输出打印日志

java 复制代码
1.  log.info("info");
2.  log.warn("warn");
3.  log.debug("debug");

8. @SneakyThrows 注解

@SneakyThrows 的用法比较简单,其实就是对于异常的一个整理,将 checked exception

看做 unchecked exception,不处理,直接扔掉 (上抛) ,减少了到处写 catch 的不便利性。

比如在线程中,catch 所有异常,再比如在一些不太可能发生异常的地方,但是你又必须

catch checked exception 的地方使用这个 annotation 会显得代码比较规整,易读。

java 复制代码
1.  public class SneakyThrowsExample implements Runnable {
2.
3.      @SneakyThrows(UnsupportedEncodingException.class)
4.      public String utf8ToString(byte[] bytes) {
5.          return new String(bytes, "UTF-8");
6.      }
7.
8.      @SneakyThrows
9.      public void run() {
10.          throw new Throwable();
11.      }
12.  }

9. @Synchronized 注解

类似于 Synchronized 关键字 但是可以隐藏同步锁

java 复制代码
1.  import lombok.Synchronized;
2.
3.  public class SynchronizedExample {
4.      private final Object readLock = new Object();
5.
6.      @Synchronized
7.      public static void hello() {
8.          System.out.println("world");
9.      }
10.
11.      @Synchronized
12.      public int answerToLife() {
13.          return 42;
14.      }
15.
16.      @Synchronized("readLock")
17.      public void foo() {
18.          System.out.println("bar");
19.      }
20.  }
相关推荐
开心工作室_kaic22 分钟前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it23 分钟前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
懒洋洋大魔王24 分钟前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康29 分钟前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神1 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
宅小海1 小时前
scala String
大数据·开发语言·scala
qq_327342731 小时前
Java实现离线身份证号码OCR识别
java·开发语言
锅包肉的九珍1 小时前
Scala的Array数组
开发语言·后端·scala
心仪悦悦1 小时前
Scala的Array(2)
开发语言·后端·scala
yqcoder2 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript