如何在Java中以内联方式初始化多个关联对象?
Java 嵌套对象的内联初始化优化
现有背景
你有如下JSON数据源:
"resource_access": { "hbg-dept": { "roles": [ "admin", "manager" ] } }
对应的Java实体类定义如下:
public class ResourceAccess { private HbgDept hbg_dept; // 需包含对应的setter方法 public void sethbg_dept(HbgDept hbg_dept) { this.hbg_dept = hbg_dept; } } public class HbgDept { private List<String> roles; // 需包含对应的setter方法 public void setRoles(List<String> roles) { this.roles = roles; } } public class UserDetails { private String name; private String preferred_username; private String given_name; private String family_name; private String email; private ResourceAccess resource_access; // 需包含对应的setter方法 public void setResource_access(ResourceAccess resource_access) { this.resource_access = resource_access; } }
当前你使用分步初始化的方式:
HbgDept vwagKums = new HbgDept(); vwagKums.setRoles(roleList); ResourceAccess resourceAccess = new ResourceAccess(); resourceAccess.sethbg_dept(vwagKums); userDetails.setResource_access(resourceAccess);
几种内联初始化的实现方式
1. 匿名内部类初始化(原生Java无额外依赖)
利用匿名内部类在创建对象时直接调用setter,实现内联初始化,风格贴近C#的对象初始化器:
userDetails.setResource_access(new ResourceAccess() {{ sethbg_dept(new HbgDept() {{ setRoles(roleList); }}); }});
这种方式不需要修改原有实体类,直接基于现有setter完成内联。
2. 添加构造器后链式初始化
给实体类添加全参构造器,就能在new对象时直接传入参数,实现一行式初始化:
先修改实体类添加构造器:
public class HbgDept { private List<String> roles; public HbgDept(List<String> roles) { this.roles = roles; } // 保留原有setter(若需保留修改能力) public void setRoles(List<String> roles) { this.roles = roles; } } public class ResourceAccess { private HbgDept hbg_dept; public ResourceAccess(HbgDept hbg_dept) { this.hbg_dept = hbg_dept; } // 保留原有setter(若需保留修改能力) public void sethbg_dept(HbgDept hbg_dept) { this.hbg_dept = hbg_dept; } }
之后就能用一行代码完成初始化:
userDetails.setResource_access(new ResourceAccess(new HbgDept(roleList)));
3. Java 9+集合工厂方法(适用于新建集合场景)
如果roleList是需要新建的集合,可直接用Java 9引入的List.of()初始化:
userDetails.setResource_access(new ResourceAccess(new HbgDept(List.of("admin", "manager"))));
4. Lombok @Builder注解(简化复杂对象构建)
若项目允许引入Lombok依赖,给实体类添加@Builder注解后,可通过流畅的链式调用构建对象:
import lombok.Builder; @Builder public class HbgDept { private List<String> roles; } @Builder public class ResourceAccess { private HbgDept hbg_dept; }
初始化代码如下:
userDetails.setResource_access( ResourceAccess.builder() .hbg_dept(HbgDept.builder().roles(roleList).build()) .build() );
总结
- 不想修改原有实体类时,匿名内部类方式最直接;
- 允许修改实体类时,添加构造器的方式代码最简洁;
- 复杂对象场景下,Lombok的
@Builder能提升代码可读性和可维护性。
内容的提问来源于stack exchange,提问作者Abhijit Mondal Abhi
相关产品推荐
相关产品推荐

