龙目岛的默认值。如何使用构造函数和生成器初始化默认值

新手上路,请多包涵

我有一个对象

@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 没有获得默认值。我在我的属性中添加 @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

原文由 Vitalii 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 463
2 个回答

我的猜测是这是不可能的(没有删除代码)。但是你为什么不直接实现你需要的构造函数呢? Lombok 旨在让您的生活更轻松,如果 Lombok 无法正常工作,请以老式方式进行。

 @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

更新

截至 01/2021, 此错误似乎已在 Lombok 中修复,至少对于生成的构造函数而言。请注意,当您混合 Builder.Default 和显式构造函数时,仍然 存在类似的问题

原文由 Michael A. Schaffrath 发布,翻译遵循 CC BY-SA 4.0 许可协议

由于 @Builder.Default 注释已损坏,我根本不会使用它。但是,您可以通过将 @Builder 注释从类级别移动到自定义构造函数来使用以下方法:

 @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 类的初始化方式与使用构建器或无参数构造函数的方式相同

换句话说,条件成立 true

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

在这种情况下,无论您如何创建对象,对象创建都是一致的。当您的类被映射框架或 JPA 提供者使用时,当您没有由构建器手动实例化它,而是在您背后调用无参数构造函数来创建实例时,这一点尤其重要。

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

原文由 Marcin Kłopotek 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题