简介

为了减少写一些 get/set/toString 方法,让项目代码更加整洁,提高开发效率,发现大家都开始采用 Lombok 这个工具。Lombok 是一个 Java 类库,它会自动插入编辑器和构建工具,用于帮助开发人员消除 Java 中冗长样板代码。而我们开发人员所要做的,仅仅是添加几个 Lombok 中的注解,就可以替换掉原来的多行 get/set/toString 方法代码,既简洁也易于维护。下面我们就来看看,如何安装并使用这一工具。

安装 Lombok

日常开发中,相信大多数人现在使用的都是 IDEA 这个 Java 神器了,如果你还在使用 Eclipse 或者 MyEclipse 等工具,那强烈推荐你去体验一把 IDEA,相信你一用上它就会爱上他它的强大!下面我就一在 IDEA 中使用 Lombok 为例,看看如何安装并使用它。

在先前 IDEA 的版本中,Lombok 是需要通过插件来安装的,安装方法如下:依次进入File -> Settings -> Plugins,然后搜索 Lombok ,最后进行安装即可。而在新版本的 IDEA 中,Lombok 已经被集成到 IDEA 中,我们不用再去安装它就可以直接使用,可以说是十分方便了。

  • 老版本 IDEA 安装 Lombok

Lombok 安装及使用指南 - 图1

  • 新版本中集成了 Lombok

Lombok 安装及使用指南 - 图2

以上就是 Lombok 的安装过程了,是不是十分简单?那接下来我们就来看看,如何在我们的项目中使用 Lombok!

Lombok 使用

现在大家进行项目管理时用的工具大多应该都是 Maven,所以我们直接在需要使用 Lombok 的项目中加入 Lombok 编译支持,也就是在 pom.xml 文件中加入以下依赖。

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. </dependency>

导入相关依赖之后,接下来就是具体使用过程了。

具体使用

在需要的实体类中引入相关注解即可,只不过注解不同它们所对应的功能也不同,而且同一个注解可能在不同位置的功能也不一样。如下图;

Lombok 安装及使用指南 - 图3

常用注解

@Data

注解在 上:给类的所有属性提供 getset 方法,此外还有 equals、canEqual、hashCode、toString 方法以及 默认参数为空的构造方法

  • 使用前
  1. package com.cunyu.user.entity;
  2. public class User {
  3. private Long id;
  4. private String name;
  5. private Integer age;
  6. private String email;
  7. public User() {
  8. }
  9. public Long getId() {
  10. return this.id;
  11. }
  12. public String getName() {
  13. return this.name;
  14. }
  15. public Integer getAge() {
  16. return this.age;
  17. }
  18. public String getEmail() {
  19. return this.email;
  20. }
  21. public void setId(final Long id) {
  22. this.id = id;
  23. }
  24. public void setName(final String name) {
  25. this.name = name;
  26. }
  27. public void setAge(final Integer age) {
  28. this.age = age;
  29. }
  30. public void setEmail(final String email) {
  31. this.email = email;
  32. }
  33. public boolean equals(final Object o) {
  34. if (o == this) {
  35. return true;
  36. } else if (!(o instanceof User)) {
  37. return false;
  38. } else {
  39. User other = (User)o;
  40. if (!other.canEqual(this)) {
  41. return false;
  42. } else {
  43. label59: {
  44. Object this$id = this.getId();
  45. Object other$id = other.getId();
  46. if (this$id == null) {
  47. if (other$id == null) {
  48. break label59;
  49. }
  50. } else if (this$id.equals(other$id)) {
  51. break label59;
  52. }
  53. return false;
  54. }
  55. Object this$age = this.getAge();
  56. Object other$age = other.getAge();
  57. if (this$age == null) {
  58. if (other$age != null) {
  59. return false;
  60. }
  61. } else if (!this$age.equals(other$age)) {
  62. return false;
  63. }
  64. Object this$name = this.getName();
  65. Object other$name = other.getName();
  66. if (this$name == null) {
  67. if (other$name != null) {
  68. return false;
  69. }
  70. } else if (!this$name.equals(other$name)) {
  71. return false;
  72. }
  73. Object this$email = this.getEmail();
  74. Object other$email = other.getEmail();
  75. if (this$email == null) {
  76. if (other$email != null) {
  77. return false;
  78. }
  79. } else if (!this$email.equals(other$email)) {
  80. return false;
  81. }
  82. return true;
  83. }
  84. }
  85. }
  86. protected boolean canEqual(final Object other) {
  87. return other instanceof User;
  88. }
  89. public int hashCode() {
  90. int PRIME = true;
  91. int result = 1;
  92. Object $id = this.getId();
  93. int result = result * 59 + ($id == null ? 43 : $id.hashCode());
  94. Object $age = this.getAge();
  95. result = result * 59 + ($age == null ? 43 : $age.hashCode());
  96. Object $name = this.getName();
  97. result = result * 59 + ($name == null ? 43 : $name.hashCode());
  98. Object $email = this.getEmail();
  99. result = result * 59 + ($email == null ? 43 : $email.hashCode());
  100. return result;
  101. }
  102. public String toString() {
  103. Long var10000 = this.getId();
  104. return "User(id=" + var10000 + ", name=" + this.getName() + ", age=" + this.getAge() + ", email=" + this.getEmail() + ")";
  105. }
  106. }
  • 使用后
  1. package com.cunyu.user.entity;
  2. import lombok.Data;
  3. /**
  4. * Created with IntelliJ IDEA.
  5. *
  6. * @author : zhangliang
  7. * @version : 1.0
  8. * @project : User
  9. * @package : com.cunyu.user.entity
  10. * @className : User
  11. * @createTime : 2021/8/6 17:14
  12. * @description : 用户实体类
  13. */
  14. @Data
  15. public class User {
  16. private Long id;
  17. private String name;
  18. private Integer age;
  19. private String email;
  20. }

@Setter

注解在 上:为该类所有属性均提供 set 方法,同时提供 默认构造方法

  • 使用前
  1. package com.cunyu.user.entity;
  2. public class User {
  3. private Long id;
  4. private String name;
  5. private Integer age;
  6. private String email;
  7. public User() {
  8. }
  9. public void setId(final Long id) {
  10. this.id = id;
  11. }
  12. public void setName(final String name) {
  13. this.name = name;
  14. }
  15. public void setAge(final Integer age) {
  16. this.age = age;
  17. }
  18. public void setEmail(final String email) {
  19. this.email = email;
  20. }
  21. }
  • 使用后
  1. package com.cunyu.user.entity;
  2. import lombok.Setter;
  3. /**
  4. * Created with IntelliJ IDEA.
  5. *
  6. * @author : zhangliang
  7. * @version : 1.0
  8. * @project : User
  9. * @package : com.cunyu.user.entity
  10. * @className : User
  11. * @createTime : 2021/8/6 17:14
  12. * @description : 用户实体类
  13. */
  14. @Setter
  15. public class User {
  16. private Long id;
  17. private String name;
  18. private Integer age;
  19. private String email;
  20. }

注解在 属性 上:为该属性提供 set 方法,同时提供 默认构造方法

  • 使用前
  1. package com.cunyu.user.entity;
  2. public class User {
  3. private Long id;
  4. private String name;
  5. private Integer age;
  6. private String email;
  7. public User() {
  8. }
  9. public void setId(final Long id) {
  10. this.id = id;
  11. }
  12. }
  • 使用后
  1. package com.cunyu.user.entity;
  2. import lombok.Setter;
  3. /**
  4. * Created with IntelliJ IDEA.
  5. *
  6. * @author : zhangliang
  7. * @version : 1.0
  8. * @project : User
  9. * @package : com.cunyu.user.entity
  10. * @className : User
  11. * @createTime : 2021/8/6 17:14
  12. * @description : 用户实体类
  13. */
  14. public class User {
  15. @Setter
  16. private Long id;
  17. private String name;
  18. private Integer age;
  19. private String email;
  20. }

@Getter

注解在 上:为该类所有属性均提供 get 方法,同时提供 默认构造方法

  • 使用前
  1. package com.cunyu.user.entity;
  2. public class User {
  3. private Long id;
  4. private String name;
  5. private Integer age;
  6. private String email;
  7. public User() {
  8. }
  9. public Long getId() {
  10. return this.id;
  11. }
  12. public String getName() {
  13. return this.name;
  14. }
  15. public Integer getAge() {
  16. return this.age;
  17. }
  18. public String getEmail() {
  19. return this.email;
  20. }
  21. }
  • 使用后
  1. package com.cunyu.user.entity;
  2. import lombok.Getter;
  3. /**
  4. * Created with IntelliJ IDEA.
  5. *
  6. * @author : zhangliang
  7. * @version : 1.0
  8. * @project : User
  9. * @package : com.cunyu.user.entity
  10. * @className : User
  11. * @createTime : 2021/8/6 17:14
  12. * @description : 用户实体类
  13. */
  14. @Getter
  15. public class User {
  16. private Long id;
  17. private String name;
  18. private Integer age;
  19. private String email;
  20. }

注解在 属性 上:为该属性提供 get 方法,同时提供 默认构造方法

  • 使用前
  1. package com.cunyu.user.entity;
  2. public class User {
  3. private Long id;
  4. private String name;
  5. private Integer age;
  6. private String email;
  7. public User() {
  8. }
  9. public Long getId() {
  10. return this.id;
  11. }
  12. }
  • 使用后
  1. package com.cunyu.user.entity;
  2. import lombok.Getter;
  3. /**
  4. * Created with IntelliJ IDEA.
  5. *
  6. * @author : zhangliang
  7. * @version : 1.0
  8. * @project : User
  9. * @package : com.cunyu.user.entity
  10. * @className : User
  11. * @createTime : 2021/8/6 17:14
  12. * @description : 用户实体类
  13. */
  14. public class User {
  15. @Getter
  16. private Long id;
  17. private String name;
  18. private Integer age;
  19. private String email;
  20. }

@ToString

注解在 上:生成所有参数的 toString() 方法,同时提供 默认构造方法

  • 使用前
  1. package com.cunyu.user.entity;
  2. public class User {
  3. private Long id;
  4. private String name;
  5. private Integer age;
  6. private String email;
  7. public User() {
  8. }
  9. public String toString() {
  10. return "User(id=" + this.id + ", name=" + this.name + ", age=" + this.age + ", email=" + this.email + ")";
  11. }
  12. }
  • 使用后
  1. package com.cunyu.user.entity;
  2. import lombok.ToString;
  3. /**
  4. * Created with IntelliJ IDEA.
  5. *
  6. * @author : zhangliang
  7. * @version : 1.0
  8. * @project : User
  9. * @package : com.cunyu.user.entity
  10. * @className : User
  11. * @createTime : 2021/8/6 17:14
  12. * @description : 用户实体类
  13. */
  14. @ToString
  15. public class User {
  16. private Long id;
  17. private String name;
  18. private Integer age;
  19. private String email;
  20. }

@Value

注解在 上:生成 get 方法,以及 equals、hashCode、toString 方法,同时提供 含所有参数的构造方法

  • 使用前
  1. package com.cunyu.user.entity;
  2. public final class User {
  3. private final Long id;
  4. private final String name;
  5. private final Integer age;
  6. private final String email;
  7. public User(final Long id, final String name, final Integer age, final String email) {
  8. this.id = id;
  9. this.name = name;
  10. this.age = age;
  11. this.email = email;
  12. }
  13. public Long getId() {
  14. return this.id;
  15. }
  16. public String getName() {
  17. return this.name;
  18. }
  19. public Integer getAge() {
  20. return this.age;
  21. }
  22. public String getEmail() {
  23. return this.email;
  24. }
  25. public boolean equals(final Object o) {
  26. if (o == this) {
  27. return true;
  28. } else if (!(o instanceof User)) {
  29. return false;
  30. } else {
  31. User other;
  32. label56: {
  33. other = (User)o;
  34. Object this$id = this.getId();
  35. Object other$id = other.getId();
  36. if (this$id == null) {
  37. if (other$id == null) {
  38. break label56;
  39. }
  40. } else if (this$id.equals(other$id)) {
  41. break label56;
  42. }
  43. return false;
  44. }
  45. label49: {
  46. Object this$age = this.getAge();
  47. Object other$age = other.getAge();
  48. if (this$age == null) {
  49. if (other$age == null) {
  50. break label49;
  51. }
  52. } else if (this$age.equals(other$age)) {
  53. break label49;
  54. }
  55. return false;
  56. }
  57. Object this$name = this.getName();
  58. Object other$name = other.getName();
  59. if (this$name == null) {
  60. if (other$name != null) {
  61. return false;
  62. }
  63. } else if (!this$name.equals(other$name)) {
  64. return false;
  65. }
  66. Object this$email = this.getEmail();
  67. Object other$email = other.getEmail();
  68. if (this$email == null) {
  69. if (other$email != null) {
  70. return false;
  71. }
  72. } else if (!this$email.equals(other$email)) {
  73. return false;
  74. }
  75. return true;
  76. }
  77. }
  78. public int hashCode() {
  79. int PRIME = true;
  80. int result = 1;
  81. Object $id = this.getId();
  82. int result = result * 59 + ($id == null ? 43 : $id.hashCode());
  83. Object $age = this.getAge();
  84. result = result * 59 + ($age == null ? 43 : $age.hashCode());
  85. Object $name = this.getName();
  86. result = result * 59 + ($name == null ? 43 : $name.hashCode());
  87. Object $email = this.getEmail();
  88. result = result * 59 + ($email == null ? 43 : $email.hashCode());
  89. return result;
  90. }
  91. public String toString() {
  92. Long var10000 = this.getId();
  93. return "User(id=" + var10000 + ", name=" + this.getName() + ", age=" + this.getAge() + ", email=" + this.getEmail() + ")";
  94. }
  95. }
  • 使用后
  1. package com.cunyu.user.entity;
  2. import lombok.Value;
  3. /**
  4. * Created with IntelliJ IDEA.
  5. *
  6. * @author : zhangliang
  7. * @version : 1.0
  8. * @project : User
  9. * @package : com.cunyu.user.entity
  10. * @className : User
  11. * @createTime : 2021/8/6 17:14
  12. * @description : 用户实体类
  13. */
  14. @Value
  15. public class User {
  16. private Long id;
  17. private String name;
  18. private Integer age;
  19. private String email;
  20. }

@AllArgsConstructor

注解在 上:为类提供一个 全参构造方法,但此时不再提供默认构造方法;

  • 使用前
  1. package com.cunyu.user.entity;
  2. public class User {
  3. private Long id;
  4. private String name;
  5. private Integer age;
  6. private String email;
  7. public User(final Long id, final String name, final Integer age, final String email) {
  8. this.id = id;
  9. this.name = name;
  10. this.age = age;
  11. this.email = email;
  12. }
  13. }
  • 使用后
  1. package com.cunyu.user.entity;
  2. import lombok.AllArgsConstructor;
  3. /**
  4. * Created with IntelliJ IDEA.
  5. *
  6. * @author : zhangliang
  7. * @version : 1.0
  8. * @project : User
  9. * @package : com.cunyu.user.entity
  10. * @className : User
  11. * @createTime : 2021/8/6 17:14
  12. * @description : 用户实体类
  13. */
  14. @AllArgsConstructor
  15. public class User {
  16. private Long id;
  17. private String name;
  18. private Integer age;
  19. private String email;
  20. }

@NoArgsConstructor

注解在 上:为类提供一个 无参构造方法

  • 使用前
  1. package com.cunyu.user.entity;
  2. public class User {
  3. private Long id;
  4. private String name;
  5. private Integer age;
  6. private String email;
  7. public User() {
  8. }
  9. }
  • 使用后
  1. package com.cunyu.user.entity;
  2. import lombok.NoArgsConstructor;
  3. /**
  4. * Created with IntelliJ IDEA.
  5. *
  6. * @author : zhangliang
  7. * @version : 1.0
  8. * @project : User
  9. * @package : com.cunyu.user.entity
  10. * @className : User
  11. * @createTime : 2021/8/6 17:14
  12. * @description : 用户实体类
  13. */
  14. @NoArgsConstructor
  15. public class User {
  16. private Long id;
  17. private String name;
  18. private Integer age;
  19. private String email;
  20. }

@RequiredArgsConstructor

注解在 上:使用类中所有带 @NonNull 注解的或带有 final 修饰的成员变量生成对应构造方法;

  • 使用前
  1. package com.cunyu.user.entity;
  2. import lombok.NonNull;
  3. public class User {
  4. @NonNull
  5. private Long id;
  6. private String name;
  7. private Integer age;
  8. @NonNull
  9. private String email;
  10. public User(@NonNull final Long id, @NonNull final String email) {
  11. if (id == null) {
  12. throw new NullPointerException("id is marked non-null but is null");
  13. } else if (email == null) {
  14. throw new NullPointerException("email is marked non-null but is null");
  15. } else {
  16. this.id = id;
  17. this.email = email;
  18. }
  19. }
  20. }
  • 使用后
  1. package com.cunyu.user.entity;
  2. import lombok.RequiredArgsConstructor;
  3. /**
  4. * Created with IntelliJ IDEA.
  5. *
  6. * @author : zhangliang
  7. * @version : 1.0
  8. * @project : User
  9. * @package : com.cunyu.user.entity
  10. * @className : User
  11. * @createTime : 2021/8/6 17:14
  12. * @description : 用户实体类
  13. */
  14. @RequiredArgsConstructor
  15. public class User {
  16. @NonNull
  17. private Long id;
  18. private String name;
  19. private Integer age;
  20. @NonNull
  21. private String email;
  22. }

@NonNull

注解在 属性 上,自动生成一个关于该参数的非空检查,若参数为 null,则抛出一个空指针异常,同时提供 默认构造方法,具体用法可以参照上面的例子;

@EqualsAndHashCode

注解在 上,生成 equals、canEquals、hasnCode 方法,同时会生成默认构造方法;

  • 使用前
  1. //
  2. // Source code recreated from a .class file by IntelliJ IDEA
  3. // (powered by FernFlower decompiler)
  4. //
  5. package com.cunyu.user.entity;
  6. public class User {
  7. private Long id;
  8. private String name;
  9. private Integer age;
  10. private String email;
  11. public User() {
  12. }
  13. public boolean equals(final Object o) {
  14. if (o == this) {
  15. return true;
  16. } else if (!(o instanceof User)) {
  17. return false;
  18. } else {
  19. User other = (User)o;
  20. if (!other.canEqual(this)) {
  21. return false;
  22. } else {
  23. label59: {
  24. Object this$id = this.id;
  25. Object other$id = other.id;
  26. if (this$id == null) {
  27. if (other$id == null) {
  28. break label59;
  29. }
  30. } else if (this$id.equals(other$id)) {
  31. break label59;
  32. }
  33. return false;
  34. }
  35. Object this$age = this.age;
  36. Object other$age = other.age;
  37. if (this$age == null) {
  38. if (other$age != null) {
  39. return false;
  40. }
  41. } else if (!this$age.equals(other$age)) {
  42. return false;
  43. }
  44. Object this$name = this.name;
  45. Object other$name = other.name;
  46. if (this$name == null) {
  47. if (other$name != null) {
  48. return false;
  49. }
  50. } else if (!this$name.equals(other$name)) {
  51. return false;
  52. }
  53. Object this$email = this.email;
  54. Object other$email = other.email;
  55. if (this$email == null) {
  56. if (other$email != null) {
  57. return false;
  58. }
  59. } else if (!this$email.equals(other$email)) {
  60. return false;
  61. }
  62. return true;
  63. }
  64. }
  65. }
  66. protected boolean canEqual(final Object other) {
  67. return other instanceof User;
  68. }
  69. public int hashCode() {
  70. int PRIME = true;
  71. int result = 1;
  72. Object $id = this.id;
  73. int result = result * 59 + ($id == null ? 43 : $id.hashCode());
  74. Object $age = this.age;
  75. result = result * 59 + ($age == null ? 43 : $age.hashCode());
  76. Object $name = this.name;
  77. result = result * 59 + ($name == null ? 43 : $name.hashCode());
  78. Object $email = this.email;
  79. result = result * 59 + ($email == null ? 43 : $email.hashCode());
  80. return result;
  81. }
  82. }
  • 使用后
  1. package com.cunyu.user.entity;
  2. import lombok.EqualsAndHashCode;
  3. /**
  4. * Created with IntelliJ IDEA.
  5. *
  6. * @author : zhangliang
  7. * @version : 1.0
  8. * @project : User
  9. * @package : com.cunyu.user.entity
  10. * @className : User
  11. * @createTime : 2021/8/6 17:14
  12. * @description : 用户实体类
  13. */
  14. @EqualsAndHashCode
  15. public class User {
  16. private Long id;
  17. private String name;
  18. private Integer age;
  19. private String email;
  20. }

@Cleanup

注解在 局部变量 前,保证该变量代表的资源使用后自动关闭,默认调用资源的 close() 方法,若该资源有其它关闭方法,可用 @Cleanup("方法名") 来指定要调用的方法,同时提供 默认构造方法;

  • 使用前
  1. import java.io.*;
  2. public class CleanupExample {
  3. public static void main(String[] args) throws IOException {
  4. InputStream in = new FileInputStream(args[0]);
  5. try {
  6. OutputStream out = new FileOutputStream(args[1]);
  7. try {
  8. byte[] b = new byte[10000];
  9. while (true) {
  10. int r = in.read(b);
  11. if (r == -1) break;
  12. out.write(b, 0, r);
  13. }
  14. } finally {
  15. if (out != null) {
  16. out.close();
  17. }
  18. }
  19. } finally {
  20. if (in != null) {
  21. in.close();
  22. }
  23. }
  24. }
  25. }
  • 使用后
  1. import lombok.Cleanup;
  2. import java.io.*;
  3. public class CleanupExample {
  4. public static void main(String[] args) throws IOException {
  5. @Cleanup InputStream in = new FileInputStream(args[0]);
  6. @Cleanup OutputStream out = new FileOutputStream(args[1]);
  7. byte[] b = new byte[10000];
  8. while (true) {
  9. int r = in.read(b);
  10. if (r == -1) break;
  11. out.write(b, 0, r);
  12. }
  13. }
  14. }

@Synchronized

注解在 类方法 或 实例方法:效果与 synchronized 关键字相同,区别在于锁对象不同,对于类方法和实例方法,synchronized 关键字的锁对象分别是 类的 **class** 对象和 **this** 对象,而 @Synchronized 的锁对象分别是 私有静态 **final** 对象 **lock** 和 私有 **final** 对象 **lock**,也可以自己指定锁对象,同时提供默认构造方法;

  • 使用前
  1. public class SynchronizedExample {
  2. private static final Object $LOCK = new Object[0];
  3. private final Object $lock = new Object[0];
  4. private final Object readLock = new Object();
  5. public static void hello() {
  6. synchronized($LOCK) {
  7. System.out.println("world");
  8. }
  9. }
  10. public int answerToLife() {
  11. synchronized($lock) {
  12. return 42;
  13. }
  14. }
  15. public void foo() {
  16. synchronized(readLock) {
  17. System.out.println("bar");
  18. }
  19. }
  20. }
  • 使用后
  1. import lombok.Synchronized;
  2. public class SynchronizedExample {
  3. private final Object readLock = new Object();
  4. @Synchronized
  5. public static void hello() {
  6. System.out.println("world");
  7. }
  8. @Synchronized
  9. public int answerToLife() {
  10. return 42;
  11. }
  12. @Synchronized("readLock")
  13. public void foo() {
  14. System.out.println("bar");
  15. }
  16. }

@SneakyThrows

注解在 方法 上:将方法中的代码用 try-catch 语句包裹,捕获异常并在 catch 中用 Lombok.sneakyThrow(e) 将异常抛出,还可以用 @SneakyThrows(Exception.class) 的形式指定抛出异常类型,同时提供 默认构造方法

  • 使用前
  1. import lombok.Lombok;
  2. public class SneakyThrowsExample implements Runnable {
  3. public String utf8ToString(byte[] bytes) {
  4. try {
  5. return new String(bytes, "UTF-8");
  6. } catch (UnsupportedEncodingException e) {
  7. throw Lombok.sneakyThrow(e);
  8. }
  9. }
  10. public void run() {
  11. try {
  12. throw new Throwable();
  13. } catch (Throwable t) {
  14. throw Lombok.sneakyThrow(t);
  15. }
  16. }
  17. }
  • 使用后
  1. import lombok.SneakyThrows;
  2. public class SneakyThrowsExample implements Runnable {
  3. @SneakyThrows(UnsupportedEncodingException.class)
  4. public String utf8ToString(byte[] bytes) {
  5. return new String(bytes, "UTF-8");
  6. }
  7. @SneakyThrows
  8. public void run() {
  9. throw new Throwable();
  10. }
  11. }

@Log

注解在 上:主要用于我们记录日志信息,同时提供 默认构造方法。它封装了多个主流 Log 库,主要有如下几个;

  • @Log
  • @Slf4j
  • Log4j
  • Log4j2

总结

以上就是关于 Lombok 的相关使用小技巧了,如果你还没有使用过它,那就赶紧去试试吧!

最后,创作不易,如果你觉得我的文章对你有所帮助,那就来个一键三连吧!

参考资料

  1. https://projectlombok.org/features/all