【发布时间】:2017-03-11 21:34:37
【问题描述】:
我正在使用 Lombok @Builder 注释,但我希望某些 String 字段是可选的并且默认为 "" 以避免 NPE。是否有捷径可寻?我什么都找不到。
或者,如果变量为null,则自定义@Getter 以返回默认值。
【问题讨论】:
标签: java getter builder lombok
我正在使用 Lombok @Builder 注释,但我希望某些 String 字段是可选的并且默认为 "" 以避免 NPE。是否有捷径可寻?我什么都找不到。
或者,如果变量为null,则自定义@Getter 以返回默认值。
【问题讨论】:
标签: java getter builder lombok
您必须提供如下所示的构建器类:
@Builder
public class XYZ {
private String x;
private String y;
private String z;
private static class XYZBuilder {
private String x = "X";
private String y = "Y";
private String z = "Z";
}
}
那么x、y、z 的默认值将是"X"、"Y"、"Z"。
【讨论】:
另一种方法是使用@Builder(toBuilder = true)
@Builder(toBuilder = true)
public class XYZ {
private String x = "X";
private String y = "Y";
private String z = "Z";
}
然后你按如下方式使用它:
new XYZ().toBuilder().build();
对于accepted answer,这种方法对类重命名不太敏感。如果你重命名XYZ 但忘记重命名内部静态类XYZBuilder,那么魔法就消失了!
使用您更喜欢的方法完全取决于您。
【讨论】:
new XYZ() 中的()
从版本v1.16.16 开始,他们添加了@Builder.Default。
@Builder.Default允许您为字段配置默认值 使用@Builder时。
示例:
@Setter
@Getter
@Builder
public class MyData {
private Long id;
private String name;
@Builder.Default
private Status status = Status.NEW;
}
PS:很高兴他们还添加了警告,以防你没有使用@Builder.Default。
警告:(35, 22) java: @Builder 将忽略初始化 完全表达。如果您希望初始化表达式服务 默认情况下,添加@Builder.Default。如果它不应该是可设置的 在构建过程中,将字段设为最终状态。
【讨论】:
@Default.Builder 和 @NoArgsConstructor(我知道这没有意义但有时由于某些框架您必须不提供任何参数构造函数),初始化器在默认构造函数中不使用!这是一个严重的错误。