首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在lombok中的默认值。如何同时使用构造函数和生成器插入默认值

在lombok中的默认值。如何同时使用构造函数和生成器插入默认值
EN

Stack Overflow用户
提问于 2017-12-19 09:38:12
回答 9查看 137.8K关注 0票数 88

我有个东西

代码语言:javascript
复制
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo {
    private int id;
    private String nick;
    private boolean isEmailConfirmed = true;
}

我用两种方式初始化它

代码语言:javascript
复制
UserInfo ui = new UserInfo();
UserInfo ui2 = UserInfo.builder().build();

System.out.println("ui: " + ui.isEmailConfirmed());
System.out.println("ui2: " + ui2.isEmailConfirmed());

这是输出

代码语言:javascript
复制
ui: true
ui2: false

似乎构建器没有得到默认值。我将@Builder.Default注释添加到我的属性中,我的对象现在如下所示

代码语言:javascript
复制
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo { 
    private int id;
    private String nick;
    @Builder.Default
    private boolean isEmailConfirmed = true;
}

这是控制台输出

代码语言:javascript
复制
ui: false
ui2: true

我怎样才能让他们成为true

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2017-12-19 10:00:16

我的猜测是,这是不可能的(没有错误的代码)。但是,为什么不直接实现所需的构造函数呢?Lombok是为了让你的生活更轻松,如果有什么东西不能用Lombok,那就用老式的方法吧。

代码语言:javascript
复制
@Data
@Builder
@AllArgsConstructor
public class UserInfo { 
    private int id;
    private String nick;
    @Builder.Default
    private boolean isEmailConfirmed = true;
    
    public UserInfo(){
        isEmailConfirmed = true;
    }
}

控制台输出:

代码语言:javascript
复制
ui: true
ui2: true

更新

从01/2021,这个错误似乎是在Lombok修复的。,至少为生成的构造函数。注意,在混合类似的问题和显式构造函数时仍然存在Builder.Default

票数 69
EN

Stack Overflow用户

发布于 2018-05-17 13:02:03

注释坏了开始,我就根本不使用它了。但是,您可以通过将@Builder注释从类级别移动到自定义构造函数,从而使用以下方法:

代码语言:javascript
复制
@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类的初始化方式与使用生成器或不使用args构造函数的方式相同。

换句话说,条件包含true

代码语言:javascript
复制
new UserInfo().equals(UserInfo.builder().build())

在这种情况下,不管您如何创建对象,对象创建都是一致的。当您的类被映射框架或JPA提供程序使用时,如果不是由构建器手动实例化类,而是在后台调用无args构造函数来创建实例,则尤为重要。

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

票数 47
EN

Stack Overflow用户

发布于 2018-02-22 10:20:34

另一种方法是定义您自己的getter方法重写 lombok getter:

代码语言:javascript
复制
@Data
@Builder
@AllArgsConstructor
public class UserInfo { 
    private int id;
    private String nick;
    private Boolean isEmailConfirmed;

    public Boolean getIsEmailConfirmed(){
      return Objects.isNull(isEmailConfirmed) ? true : isEmailConfirmed;
    }
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47883931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档