@With
不可变的 'setter' - 创建克隆但只更改一个字段的方法。
@Wither
在 lombok v0.11.4 中作为实验性功能引入。
@Wither
在 lombok v1.18.10 中被重命名为 @With
,并从实验性包移至核心包。
概述
对于不可变属性,setter 之外的下一个最佳替代方案是构造对象的克隆,但此字段使用新值。生成此克隆的方法正是 @With
生成的内容:一个 withFieldName(newValue)
方法,它生成一个克隆,但关联字段的值是新值。
例如,如果您创建 public class Point { private final int x, y; }
,setter 没有意义,因为字段是 final 的。@With
可以为您生成一个 withX(int newXValue)
方法,该方法将返回一个新点,其中 x
具有提供的值,而 y
具有相同的值。
@With
依赖于所有字段的构造函数才能工作。如果此构造函数不存在,您的 @With
注解将导致编译时错误消息。您可以使用 Lombok 自己的 @AllArgsConstructor
,或者由于 Value
也会自动生成一个 all args 构造函数,您也可以使用它。当然,如果您手动编写此构造函数也是可以接受的。它必须包含所有非静态字段,并按相同的词法顺序排列。
与 @Setter
类似,您可以指定访问级别,以防您希望生成的 with 方法不是 public
@With(level = AccessLevel.PROTECTED)
。同样与 @Setter
类似,您也可以在类型上放置 @With
注解,这意味着将为每个字段生成一个 with
方法(即使是非 final 字段)。
要在生成的方法上放置注解,您可以使用 onMethod=@__({@AnnotationsHere})
。但请小心!这是一个实验性功能。有关更多详细信息,请参阅关于 onX 功能的文档。
字段上的 javadoc 将被复制到生成的 with 方法。通常,所有文本都会被复制,@param
会移动到 with 方法,而 @return
行则从 with 方法的 javadoc 中删除。“移动”表示:从字段的 javadoc 中删除。也可以为 with 方法的 javadoc 定义唯一的文本。为此,您需要创建一个名为 WITH
的“部分”。部分是 javadoc 中的一行,包含 2 个或更多破折号,然后是文本“WITH”,后跟 2 个或更多破折号,并且该行上没有其他内容。如果您使用部分,则不再对该部分执行 @return
和 @param
的剥离/复制(将 @param
行移动到该部分)。
使用 Lombok
import lombok.AccessLevel;
|
原生 Java
import lombok.NonNull;
|
支持的配置键
-
lombok.accessors.prefix
+= 字段前缀 (默认值: 空列表) - 这是一个列表属性; 可以使用
+=
运算符添加条目。可以使用-=
运算符删除从父配置文件继承的前缀。 Lombok 将从字段名称中剥离任何匹配的字段前缀,以确定要生成的 getter/setter 的名称。例如,如果m
是此设置中列出的前缀之一,则名为mFoobar
的字段将导致名为getFoobar()
的 getter,而不是getMFoobar()
。显式配置的@Accessors
注解的prefix
参数优先于此设置。 -
lombok.accessors.capitalization
= [basic
|beanspec
] (默认值: basic) - 控制如何大写像
uShaped
这样的棘手情况(一个小写字母后跟一个大写/首字母大写字母)。basic
将其大写为withUShaped
,而beanspec
则将其大写为withuShaped
。
这两种策略在 java 生态系统中都很常用,尽管beanspec
更常见。 -
lombok.with.flagUsage
= [warning
|error
] (默认值: 未设置) - 如果配置,Lombok 会将任何
@With
的使用标记为警告或错误。
小字印刷
with 方法不能为静态字段生成,因为这没有意义。
with 方法可以为抽象类生成,但这会生成具有适当签名的抽象方法。
当将 @With
应用于类型时,将跳过静态字段和名称以 $ 开头的字段。
对于生成方法名称,字段的第一个字符(如果是小写字符)将被首字母大写,否则保持不变。然后,前缀 with
。
如果已存在任何具有相同名称(不区分大小写)和相同参数计数的方法,则不会生成任何方法。例如,如果已经有一个方法 withX(String... x)
,即使从技术上讲可以创建该方法,也不会生成 withX(int x)
。此警告的存在是为了防止混淆。如果由于此原因跳过方法的生成,则会发出警告。Varargs 算作 0 到 N 个参数。
关于空值的各种众所周知的注解会导致插入空值检查,并将复制到参数。有关更多信息,请参见 Getter/Setter 文档的小字印刷部分。
如果您通过 lombok.config
键 lombok.addNullAnnotations
配置了空值注解风格,则方法或返回类型(根据所选风格)将使用非空注解进行注解。