对Java编程语言最常提出的批评之一是它需要大量的样板代码 。 对于简单的类尤其如此,该类只需要存储一些值就可以。 您需要这些值的getter和setter,也许您还需要一个构造函数,覆盖equals()和
hashcode()通常是必需的,也许您想要一个更有用的toString()实现。 最后,您可能有100行代码,可以用10行Scala或Groovy代码重写。 诸如Eclipse或IntelliJ的Java IDE试图通过提供各种类型的代码生成功能来减少此问题。 但是,即使您不必自己编写代码,如果在IDE中打开这样的文件,也始终会看到它(并被它分散注意力)。
Lombok项目 (不要被丑陋的网页吓到)是一个小型Java库,可以帮助减少Java应用程序中的样板代码量。 Lombok项目提供了一组注释,这些注释在开发时会进行处理,以将代码注入Java应用程序中。 注入的代码可立即在您的开发环境中使用。
让我们看一下下面的Eclipse屏幕截图:
定义的类使用Lombok的@Data注释进行注释,并且最多包含三个私有字段。 @Data自动注入getter,setter(用于非final字段),equals(),hashCode(),toString()和用于初始化final dateBirth字段的构造函数。 如您所见,生成的方法可直接在Eclipse中使用,并显示在Outline视图中。
设定
要为您的应用程序设置Lombok,必须将lombok.jar放入类路径。 如果您使用的是Maven,则只需将以下依赖项添加到pom.xml中:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.14.6</version>
<scope>provided</scope>
</dependency>
您还需要在使用的IDE中设置Lombok:
- NetBeans用户只需在其项目属性中启用“在编辑器中启用注释处理”选项即可(请参阅: NetBeans说明 )。
- Eclipse用户可以通过双击lombok.jar并遵循快速安装向导来安装Lombok。
- 对于IntelliJ,可以使用Lombok插件 。
入门
简介中显示的@Data注释实际上是各种其他Lombok注释的快捷方式。 有时@Data做得太多。 在这种情况下,您可以使用更具体的Lombok注释,从而为您提供更大的灵活性。
使用@Getter和@Setter可以实现仅生成getter和setter:
@Getter
@Setter
public class Person {
private final LocalDate birthday;
private String firstName;
private String lastName;
public Person(LocalDate birthday) {
this.birthday = birthday;
}
}
请注意,布尔字段的getter方法以is代替get的前缀(例如isFoo()代替getFoo())。 如果只想为特定字段生成getter和setter,则可以注释这些字段而不是类。
生成equals(),hashCode()和toString():
@EqualsAndHashCode
@ToString
public class Person {
...
}
@EqualsAndHashCode和@ToString也具有各种可用于自定义其行为的属性:
@EqualsAndHashCode(exclude = {"firstName"})
@ToString(callSuper = true, of = {"firstName", "lastName"})
public class Person {
...
}
在此,equals()和hashCode()不会考虑字段firstName。 toString()将首先调用super.toString(),并且仅考虑firstName和lastName。
对于生成构造函数,可以使用多个注释:
- @NoArgsConstructor生成不带参数的构造函数(默认构造函数)。
- @RequiredArgsConstructor为所有未初始化的最终字段生成一个带有一个参数的构造函数。
- @AllArgsConstructor为类中的所有字段生成一个带有一个参数的构造函数。
@Data批注实际上是@ ToString,@ EqualsAndHashCode,@ Getter,@ Setter和@RequiredArgsConstructor的常用快捷方式。
如果您喜欢不可变的类,则可以使用@Value代替@Data:
@Value
public class Person {
LocalDate birthday;
String firstName;
String lastName;
}
@Value是@ ToString,@ EqualsAndHashCode,@ AllArgsConstructor,@ FieldDefaults(makeFinal = true,level = AccessLevel.PRIVATE)和@Getter的快捷方式。
因此,使用@Value可以获取toString(),equals(),hashCode(),getter和具有每个字段一个参数的构造函数。 默认情况下,它也将所有字段设置为私有和最终,因此您不必添加私有或最终修饰符。
看Lombok的实验特征
除了到目前为止显示的受支持的注释之外,Lombok还具有一些实验功能,可以在“ 实验功能”页面上找到它们。
我特别喜欢的这些功能之一是@Builder批注,它提供了Builder Pattern的实现。
@Builder
public class Person {
private final LocalDate birthday;
private String firstName;
private String lastName;
}
@Builder生成一个静态builder()方法,该方法返回一个生成器实例。 此构建器实例可用于构建带有@Builder注释的类的对象(此处为Person):
Person p = Person.builder()
.birthday(LocalDate.of(1980, 10, 5))
.firstName("John")
.lastName("Smith")
.build();
顺便说一句,如果您想知道LocalDate类是什么,就应该看看我有关Java 8日期和时间API的博客文章!
结论
Lombok计划基于注释注入生成的方法,例如getter和setter。 它提供了一种简便的方法,可显着减少Java应用程序中的样板代码。
请注意,这样做有一个弊端:根据reddit评论 (包括项目作者的评论),Lombok必须依靠各种黑客手段才能完成工作。 因此,将来的JDK或IDE版本可能会破坏项目Lombok的功能。 另一方面,这些评论是5年前发表的,而Lombok计划仍在积极维护。
- 您可以在GitHub上找到Project Lombok的源代码。