lombok中的默认值。 如何使用构造函数和构建器初始化默认值

我有一个对象

@Data @Builder @NoArgsConstructor @AllArgsConstructor public class UserInfo { private int id; private String nick; private boolean isEmailConfirmed = true; } 

我用两种方式初始化它

 UserInfo ui = new UserInfo(); UserInfo ui2 = UserInfo.builder().build(); System.out.println("ui: " + ui.isEmailConfirmed()); System.out.println("ui2: " + ui2.isEmailConfirmed()); 

这是输出

 ui: true ui2: false 

似乎构建器没有获得默认值。 我将@Builder.Default注释添加到我的属性中,我的对象现在看起来像这样

 @Data @Builder @NoArgsConstructor @AllArgsConstructor public class UserInfo { private int id; private String nick; @Builder.Default private boolean isEmailConfirmed = true; } 

这是控制台输出

 ui: false ui2: true 

我怎样才能使它们都成为true

我的猜测是,这是不可能的(没有删除代码)。 但是你为什么不实现你需要的构造函数呢? 龙目岛旨在让您的生活更轻松,如果某些东西不适用于龙目岛,只需按照老式的方式进行。

 @Data @Builder @AllArgsConstructor public class UserInfo { private int id; private String nick; @Builder.Default private boolean isEmailConfirmed = true; public UserInfo(){ isEmailConfirmed = true; } } 

控制台输出:

 ui: true ui2: true 

由于@Builder.Default注释被破坏 ,我根本不会使用它。 但是,您可以使用以下方法:

 @Data @NoArgsConstructor public class UserInfo { private int id; private String nick; private boolean isEmailConfirmed = true; @Builder @SuppressWarnings("unused") private UserInfo(int id, String nick, Boolean isEmailConfirmed) { this.id = id; this.nick = nick; this.isEmailConfirmed = Optional.ofNullable(isEmailConfirmed).orElse(this.isEmailConfirmed); } } 

这样你可以确保:

  • 字段isEmailConfirmed仅在一个地方初始化,使代码不易出错,以后更容易维护
  • UserInfo类的初始化方式与使用构建器或无参数构造函数的方式相同

换句话说,条件成立:

 new UserInfo().equals(UserInfo.builder().build()) 

在这种情况下,无论您如何创建对象,对象创建都是一致的。 当您的类由映射框架或JPA提供程序使用时,如果您没有由构建器手动实例化它,但在您的背后调用no-args来创建实例,则尤其需要它。

上述方法非常相似,但它有一个主要缺点。 您必须在两个位置初始化字段,这会使代码容易出错,因为您需要保持值一致。

另一种方法是定义你自己的getter方法覆盖 lombok getter:

 @Data @Builder @AllArgsConstructor public class UserInfo { private int id; private String nick; private Boolean isEmailConfirmed; public Boolean getIsEmailConfirmed(){ return Objects.isNull(isEmailConfirmed) ? true : isEmailConfirmed; } }