如何避免Java Record集合属性为null?求空列表默认值更优方案
如何给Java Record的集合属性设置非空默认值
你定义的Car Record如下:
public record Car( long id, String model, List<Wheel> wheels ) { }
需求是让wheels集合属性不允许为null,在传入null时自动设为空列表,你已经通过自定义紧凑构造器实现了该功能:
public record Car( long id, String model, List<Wheel> wheels ) { public Car { if (wheels == null) { wheels = new ArrayList<>(); } } }
这个方案本身是可行的,下面提供几种更简洁或更贴合设计原则的优化方案:
1. 用Objects.requireNonNullElse简化构造器逻辑
从*Java 9+*开始,可以使用Objects.requireNonNullElse方法替代手动的null判断,让代码更简洁直观:
public record Car( long id, String model, List<Wheel> wheels ) { public Car { // 若wheels为null,返回新的ArrayList实例,否则返回原对象 wheels = Objects.requireNonNullElse(wheels, new ArrayList<>()); } }
2. 使用不可变空列表增强安全性
如果希望避免外部代码意外修改wheels集合(符合Record的不可变性设计理念),可以用不可变空列表替代new ArrayList<>():
public record Car( long id, String model, List<Wheel> wheels ) { public Car { // Java 8及以上可用Collections.emptyList() wheels = Objects.requireNonNullElse(wheels, Collections.emptyList()); // Java 9+也可以用List.of(),语义更清晰 // wheels = Objects.requireNonNullElse(wheels, List.of()); } }
不可变空列表无法被修改,能避免后续代码误操作导致的集合变更,提升代码稳定性。
3. 封装静态工厂方法优化API易用性
可以通过静态工厂方法封装Car的创建逻辑,对外提供更友好的调用方式,同时内部处理null的情况:
public record Car( long id, String model, List<Wheel> wheels ) { // 私有紧凑构造器,确保内部的wheels非空 private Car { wheels = Objects.requireNonNullElse(wheels, new ArrayList<>()); } // 完整参数的工厂方法 public static Car of(long id, String model, List<Wheel> wheels) { return new Car(id, model, wheels); } // 重载工厂方法,支持不传入wheels的场景 public static Car of(long id, String model) { return new Car(id, model, null); } }
这样调用方可以根据需求选择不同的工厂方法,无需手动处理空列表的情况,API的易用性更强。
内容的提问来源于stack exchange,提问作者S.Dan
相关产品推荐
相关产品推荐

