我有个东西
@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
发布于 2017-12-19 10:00:16
我的猜测是,这是不可能的(没有错误的代码)。但是,为什么不直接实现所需的构造函数呢?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。
发布于 2018-05-17 13:02:03
从注释坏了开始,我就根本不使用它了。但是,您可以通过将@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类的初始化方式与使用生成器或不使用args构造函数的方式相同。换句话说,条件包含true
new UserInfo().equals(UserInfo.builder().build())在这种情况下,不管您如何创建对象,对象创建都是一致的。当您的类被映射框架或JPA提供程序使用时,如果不是由构建器手动实例化类,而是在后台调用无args构造函数来创建实例,则尤为重要。
上文所述的方法非常相似,但它有一个主要的缺点。您必须在两个地方初始化该字段,这使得代码容易出错,因为您需要保持值的一致性。
发布于 2018-02-22 10:20:34
另一种方法是定义您自己的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;
}
}https://stackoverflow.com/questions/47883931
复制相似问题