You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 19:32:35