Lombok 是一个充当 Java 注释处理器的库,旨在消除代码中的冗余。它的主要功能是自动生成重复代码或“样板文件”——这些元素虽然必要,但不会为我们的程序逻辑添加直接价值。主要用于在编译时自动生成 getter 和 setter 方法、构造函数、equals()、hashCode()、toString() 方法以及 Java 类中的其他常见元素。
无需为这些基本功能手动编写数十行代码,Lombok 允许您使用简单的注释来定义它们,从而产生更干净、更易于维护且不易出错的代码。
要在Java项目中使用Lombok,除了安装之外,还需要在pom.xml文件(如果是Maven项目)或build.gradle(如果是Gradle项目)中添加相应的依赖我们正在使用的IDE中的相应插件。在这篇文章中,我们将使用 Maven 和 IntelliJ IDEA 作为示例。
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.36</version> <scope>provided</scope> </dependency> </dependencies>
如有任何疑问,您可以随时查看Lombok的官方文档:
当我们创建一个类时,我们会定期执行以下操作,无论是手动还是使用 IDE 提供的快捷方式:
嗯,Lombok 有 @Data 注释,它允许我们在一行中完成所有这些操作,生成与 POJO(普通旧 Java 对象) 相关的所有内容。这个注解是 @Getter、@Setter、@EqualsAndHashCode、@NoArgsConstructor 和 @AllArgsConstructor 注解的组合,我们稍后会看到。
import lombok.Data; @Data public class Persona { private String nombre; }
public class Main { public static void main(String[] args) { Persona p1 = new Persona(); p2.setNombre("Maria"); System.out.println(p1.getNombre()); } }
这些注释允许我们自动生成具有不同参数组合的构造函数,考虑到属性是根据它们在类中声明的顺序使用的。
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.36</version> <scope>provided</scope> </dependency> </dependencies>
这些注解可以让我们自动为类的所有属性生成 getter 和 setter 方法,或者只为那些标有相应注解的属性生成 getter 和 setter 方法,即可以在类或属性级别使用。
import lombok.Data; @Data public class Persona { private String nombre; }
public class Main { public static void main(String[] args) { Persona p1 = new Persona(); p2.setNombre("Maria"); System.out.println(p1.getNombre()); } }
该注解自动生成 toString() 方法,该方法返回类及其属性的字符串表示形式,格式如下:ClassName(attribute1=value1, attribute2=value2, ...)。默认情况下,类的所有非静态属性都包含在结果中,但可以使用 @ToString.Exclude 属性排除特定属性。如果您只想显示属性的值而不是声明的名称,可以使用 @ToString(includeFieldNames = false)。
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Persona { private String nombre; }
允许您从类的所有属性生成 equals() 和 hashCode() 方法,如果您想排除或包含某个属性,可以使用注释 @EqualsAndHashCode.Exclude 和 @EqualsAndHashCode.Include 来实现。分别。
import lombok.*; @Getter @Setter public class Persona { private String nombre; private String apellido; }
以前,在 Java 中创建不可变类需要执行一系列步骤,例如使类和/或属性成为最终类型,并且不会生成 setter 方法。 Lombok 使我们可以轻松地使用 @Value 注解创建不可变类,该注解结合了 @Getter、@ToString、@EqualsAndHashCode 和 @AllArgsConstructor 注解来生成不可变类。所有属性都标记为 private Final,并且不会生成 setter 方法。它是 @Data 的不可变变体。
import lombok.*; public class Persona { @Getter @Setter private String nombre; private String apellido; }
在 Java 的最新版本中,与使用记录相比,此注释失去了意义,因为它们具有相同的目的,并且使用记录更实用。如果您有兴趣了解更多有关此主题的信息,博客上还有更多有关记录的帖子。
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.36</version> <scope>provided</scope> </dependency> </dependencies>
这个注解允许我们将一个变量声明为final并自动推断它的数据类型,也就是说,不需要指定变量的数据类型,Lombok会负责推断它。如果变量数据类型很长或很复杂,它很有用,这样可以避免重复。
import lombok.Data; @Data public class Persona { private String nombre; }
如果我们直接使用final var或者简单的var进行类型推断,这个注解可能会失去意义,因为这是语言的特性,这样更方便。如果您有兴趣了解更多,可以参考以下帖子
public class Main { public static void main(String[] args) { Persona p1 = new Persona(); p2.setNombre("Maria"); System.out.println(p1.getNombre()); } }
它的工作方式与@val完全相同,但它不将变量声明为final,它只是推断其类型。有必要考虑类型推断的概念,因为您不能声明 String 类型的内容,并且想要为其分配 int 类型的值也不是最终的。同样,在最新版本的 Java 中,该注释被 var 取代。
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Persona { private String nombre; }
这个注解可以用在类的属性和方法的参数上,它基本上表明属性的值不能为空,如果尝试将空值分配给标记为@NonNull的属性,它会抛出 NullPointerException,即使用 if (param == null) throw new NullPointerException("param is tagged non-null but is null"); 。无论它生成什么异常,它的使用在 IDE 本身中都更加明显,因为它会以某种方式向我们表明该值不能为空。
import lombok.*; @Getter @Setter public class Persona { private String nombre; private String apellido; }
此注释允许我们确保任何使用它的资源(如果它具有 close() 方法或实现 AutoCloseable 或 Closeable 接口)都会在其所在代码块的末尾自动关闭。它在处理需要释放的资源时非常有用,例如文件、数据库连接等。
import lombok.*; public class Persona { @Getter @Setter private String nombre; private String apellido; }
如果我们使用资源尝试,可以手动获得此结果。
import lombok.*; @AllArgsConstructor @ToString public class Persona { private String nombre; @ToString.Exclude private String apellido; } // Output: Persona(nombre=Maria)
这个注解可以让我们自动生成一个设计模式Builder,即一个可以让我们一步步构建复杂对象的对象,这样就可以配置一个对象的不同属性,而无需调用带有多个参数的构造函数。如果一个类有很多属性并且我们不希望有一个带有很多参数的构造函数,那么它很有用。
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.36</version> <scope>provided</scope> </dependency> </dependencies>
这个注解允许我们创建一个方法,该方法返回带有修改属性的当前对象的副本,即它生成一个方法 withAttributeName(Object object) ,该方法允许我们用该对象创建当前对象的副本属性由我们作为参数传递的值修改。当我们想要修改对象的属性而不修改原始对象时,它非常有用。
import lombok.Data; @Data public class Persona { private String nombre; }
public class Main { public static void main(String[] args) { Persona p1 = new Persona(); p2.setNombre("Maria"); System.out.println(p1.getNombre()); } }
到目前为止,我们已经看到了一些最常用的注释,每个注释可能接受也可能不接受额外的配置,同样还有其他注释被标记为实验性的,无论如何,参考很重要官方文档,以充分利用 Lombok 为我们提供的所有功能以及重复代码生成方面的优势。
以上是Java 中的 Lombok 项目的详细内容。更多信息请关注PHP中文网其他相关文章!