@Value
不可变类变得非常简单。
@Value
在 lombok v0.11.4 中作为实验性功能引入。
自 lombok v0.11.8 起,@Value
不再暗示 @With
。
@Value
自 lombok v0.12.0 起被提升到主 lombok
包中。
概述
@Value
是 @Data
的不可变变体;所有字段默认都是 private
和 final
,并且不生成 setter。类本身默认也是 final
,因为不可变性不能强制应用于子类。与 @Data
类似,也会生成有用的 toString()
、equals()
和 hashCode()
方法,每个字段都会获得一个 getter 方法,并且还会生成一个包含每个参数的构造函数(除了在字段声明中初始化的 final
字段)。
实际上,@Value
是以下内容的简写:final @ToString @EqualsAndHashCode @AllArgsConstructor @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @Getter
,但显式包含任何相关方法的实现仅意味着不会生成该部分,并且不会发出警告。例如,如果您编写了自己的 toString
,则不会发生错误,并且 lombok 不会生成 toString
。此外,任何显式构造函数,无论参数列表如何,都意味着 lombok 不会生成构造函数。如果您确实希望 lombok 生成 all-args 构造函数,请将 @AllArgsConstructor
添加到类中。请注意,如果类上同时存在 `@Builder` 和 `@Value`,则 `@Builder` 想要创建的包私有 allargs 构造函数将“胜过”`@Value` 想要创建的公共构造函数。您可以使用 @lombok.experimental.Tolerate
标记任何构造函数或方法,以将其从 lombok 中隐藏。
可以使用字段上的显式访问级别,或使用 @NonFinal
或 @PackagePrivate
注解来覆盖默认的 final 和 private 行为。@NonFinal
也可以在类上使用,以删除 final 关键字。
可以通过显式使用该注解来覆盖构成 @Value
的任何“部分”的任何默认行为。
使用 Lombok
import lombok.AccessLevel;
|
原生 Java
import java.util.Arrays;
|
支持的配置键
-
lombok.value.flagUsage
= [warning
|error
] (默认值:未设置) - 如果配置,Lombok 将把任何
@Value
的使用标记为警告或错误。 -
lombok.noArgsConstructor.extraPrivate
= [true
|false
] (默认值:false) - 如果为
true
,lombok 将为任何@Value
注解的类生成一个私有的无参构造函数,该构造函数将所有字段设置为默认值(null / 0 / false)。
小字号声明
查找关于 @Value
的“组成部分”的文档:@ToString
、@EqualsAndHashCode
、@AllArgsConstructor
、@FieldDefaults
和 @Getter
。
对于具有泛型的类,有一个充当构造函数的静态方法很有用,因为通过静态方法推断泛型参数在 java6 中有效,并且避免了必须使用菱形运算符。虽然您可以通过应用显式的 @AllArgsConstructor(staticConstructor="of")
注解来强制执行此操作,但还有 @Value(staticConstructor="of")
功能,它将使生成的 all-arguments 构造函数变为私有,并生成一个名为 of
的公共静态方法,该方法是此私有构造函数的包装器。
关于空值的各种众所周知的注解会导致插入空值检查,并将被复制到相关位置(例如 getter 的方法,以及构造函数和 setter 的参数)。有关更多信息,请参阅 Getter/Setter 文档的小字号声明。
@Value
是从 v0.11.4 到 v0.11.9 的实验性功能(作为 @lombok.experimental.Value
)。此后,它已移至核心包中。旧的注解仍然存在(并且是别名)。但是,它最终将在未来的版本中删除。
不能使用 @FieldDefaults
来“撤消”注解类中字段的默认 private 和默认 final 方面。在类中的字段上使用 @NonFinal
和 @PackagePrivate
来覆盖此行为。