@Data
现在一起来:@ToString
、@EqualsAndHashCode
、所有字段的 @Getter
、所有非 final 字段的 @Setter
和 @RequiredArgsConstructor
的快捷方式!
概述
@Data
是一个方便的快捷注释,它捆绑了 @ToString
、@EqualsAndHashCode
、@Getter
/ @Setter
和 @RequiredArgsConstructor
的功能:换句话说,@Data
生成所有通常与简单 POJO(Plain Old Java Objects)和 bean 关联的样板代码:所有字段的 getter,所有非 final 字段的 setter,以及涉及类字段的适当的 toString
、equals
和 hashCode
实现,以及一个初始化所有 final 字段以及所有没有初始化器且已标记为 @NonNull
的非 final 字段的构造函数,以确保该字段永远不为 null。
@Data
就像在类上隐式地使用了 @Getter
、@Setter
、@ToString
、@EqualsAndHashCode
和 @RequiredArgsConstructor
注释一样(除非如果已经存在任何显式编写的构造函数,则不会生成构造函数)。但是,这些注释的参数(例如 callSuper
、includeFieldNames
和 exclude
)不能使用 @Data
设置。如果您需要为这些参数中的任何一个设置非默认值,只需显式添加这些注释即可;@Data
足够智能,可以服从这些注释。
所有生成的 getter 和 setter 都将是 public
的。要覆盖访问级别,请使用显式的 @Setter
和/或 @Getter
注释注释字段或类。您还可以使用此注释(通过将其与 AccessLevel.NONE
结合使用)来完全禁止生成 getter 和/或 setter。
所有标记为 transient
的字段将不被 hashCode
和 equals
考虑。所有静态字段将被完全跳过(不考虑任何生成的方法,并且不会为它们创建 setter/getter)。
如果类已经包含一个与通常会生成的任何方法具有相同名称和参数计数的方法,则不会生成该方法,并且不会发出警告或错误。例如,如果您已经有一个签名 equals(AnyType param)
的方法,则不会生成 equals
方法,即使从技术上讲,由于具有不同的参数类型,它可能是一个完全不同的方法。相同的规则适用于构造函数(任何显式构造函数都将阻止 @Data
生成构造函数),以及 toString
、equals
以及所有 getter 和 setter。您可以将任何构造函数或方法标记为 @lombok.experimental.Tolerate
以将其从 lombok 中隐藏。
@Data
可以很好地处理字段的泛型参数。为了减少为具有泛型的类构造对象时的样板代码,您可以使用 staticConstructor
参数来生成私有构造函数,以及返回新实例的静态方法。这样,javac 将推断变量名。因此,通过像这样声明:@Data(staticConstructor="of") class Foo<T> { private T x;}
,您可以通过编写 Foo.of(5);
而不是必须编写 new Foo<Integer>(5);
来创建 Foo
的新实例。
使用 Lombok
import lombok.AccessLevel;
|
原生 Java
import java.util.Arrays;
|
支持的配置键
-
lombok.data.flagUsage
= [warning
|error
] (默认值:未设置) - 如果配置了,Lombok 将把任何
@Data
的使用标记为警告或错误。 -
lombok.noArgsConstructor.extraPrivate
= [true
|false
] (默认值:false) - 如果为
true
,lombok 将为任何@Data
注释的类生成一个私有的无参构造函数,该构造函数将所有字段设置为默认值(null / 0 / false)。
小字细则
请参阅 @ToString
、@EqualsAndHashCode
、@Getter / @Setter
和 @RequiredArgsConstructor 的小字细则。
关于空值的各种众所周知的注释会导致插入空值检查,并将被复制到相关位置(例如 getter 的方法,以及构造函数和 setter 的参数)。有关更多信息,请参阅 Getter/Setter 文档的小字细则。
默认情况下,任何以 $ 符号开头的变量都会自动排除。您可以通过指定显式注释(例如 @Getter
或 @ToString
)并使用 'of' 参数来包含它们。