我有一个对象
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo {
private int id;
private String nick;
private boolean isEmailConfirmed = true;
}
Run Code Online (Sandbox Code Playgroud)
我用两种方式初始化它
UserInfo ui = new UserInfo();
UserInfo ui2 = UserInfo.builder().build();
System.out.println("ui: " + ui.isEmailConfirmed());
System.out.println("ui2: " + ui2.isEmailConfirmed());
Run Code Online (Sandbox Code Playgroud)
这是输出
ui: true
ui2: false
Run Code Online (Sandbox Code Playgroud)
似乎构建器没有获得默认值.我@Builder.Default向我的属性添加注释,我的对象现在看起来像这样
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo {
private int id;
private String nick;
@Builder.Default
private boolean isEmailConfirmed = true;
}
Run Code Online (Sandbox Code Playgroud)
这是控制台输出
ui: false
ui2: true
Run Code Online (Sandbox Code Playgroud)
我怎么能让它们都成为true?
Mar*_*tek 34
由于@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);
}
}
Run Code Online (Sandbox Code Playgroud)
这样你可以确保:
@Builder仅在一个地方初始化,使代码不易出错,以后更容易维护isEmailConfirmed班将被初始化或者您使用的助洗剂或无参数的构造以同样的方式换句话说,条件成立UserInfo:
new UserInfo().equals(UserInfo.builder().build())
Run Code Online (Sandbox Code Playgroud)
在这种情况下,无论您如何创建对象,对象创建都是一致的.当您没有由构建器手动实例化它而您的类由映射框架或JPA提供程序使用时,尤其重要的是,在您的后面调用no-args构造函数来创建实例.
该方法上面描述的非常相似,但它有一个很大的缺点.您必须在两个位置初始化字段,这会使代码容易出错,因为您需要保持值一致.
Mic*_*ath 18
我的猜测是,这是不可能的(没有删除代码).但是你为什么不实现你需要的构造函数呢?龙目岛旨在让您的生活更轻松,如果某些东西不能与龙目岛一起使用,那就按老式方式做吧.
@Data
@Builder
@AllArgsConstructor
public class UserInfo {
private int id;
private String nick;
@Builder.Default
private boolean isEmailConfirmed = true;
public UserInfo(){
isEmailConfirmed = true;
}
}
Run Code Online (Sandbox Code Playgroud)
控制台输出:
ui: true
ui2: true
Run Code Online (Sandbox Code Playgroud)
另一种方法是定义你自己的getter方法覆盖的龙目岛的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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的经验是,@Builder当它是实例化类的唯一方法时,效果最好,因此与 配对而@Value不是 时效果最好@Data。
对于所有字段都以任何顺序可变的类,并且您想要保留链式调用,请考虑将其替换为@Accessors(chain=true)or @Accessors(fluent=true)。
@Data
@Accessors(fluent=true)
public class UserInfo {
private int id;
private String nick;
private boolean isEmailConfirmed = true;
}
Run Code Online (Sandbox Code Playgroud)
这使您可以在代码中流畅地构造对象,并避免不必要的创建 Builder 对象:
UserInfo ui = new UserInfo().id(25).nick("John");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38529 次 |
| 最近记录: |