如何创建含空List而非null的Java对象?多List场景及API方案
问题解答
1. 单个List属性初始化为空列表
有两种简单方式可以让Cart对象创建时items默认是空列表:
方式1:字段声明时直接初始化
@Data class Cart{ int cartId; List<Item> items = new ArrayList<>(); // 直接初始化为空ArrayList }
方式2:自定义无参构造函数
手动覆盖Lombok自动生成的无参构造,在构造里初始化字段:
@Data class Cart{ int cartId; List<Item> items; public Cart() { this.items = new ArrayList<>(); } }
运行Test类后,输出会变为 Cart(cartId=0, items=[])。
2. 批量初始化多个List类型属性
如果有10个List属性,推荐两种批量处理方案:
方案1:反射工具类批量初始化
通过反射遍历类中所有List类型字段,统一赋值为空列表,可封装成工具方法复用:
public class ListInitUtil { @SuppressWarnings("unchecked") public static <T> void initEmptyLists(T obj) { Class<?> clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (List.class.isAssignableFrom(field.getType())) { field.setAccessible(true); try { field.set(obj, new ArrayList<>()); // 可替换为其他List实现类 } catch (IllegalAccessException e) { throw new RuntimeException("初始化List字段失败", e); } } } } }
使用时在构造函数或对象创建后调用:
@Data class Cart{ int cartId; List<Item> items; List<String> tags; // 其他8个List属性... public Cart() { ListInitUtil.initEmptyLists(this); } }
方案2:Lombok+初始化块集中处理
如果依赖Lombok,可结合初始化块集中初始化所有List字段,比分散声明更整洁:
@Data @FieldDefaults(level = AccessLevel.PRIVATE) class Cart{ int cartId; List<Item> items; List<String> tags; // 其他List属性... { items = new ArrayList<>(); tags = new ArrayList<>(); // 剩余List字段依次初始化... } }
3. 使用ObjectMapper或其他API实现
可以通过Jackson的ObjectMapper或Spring的Bean工具类实现需求:
方式1:ObjectMapper反序列化时自动初始化
利用@JsonSetter注解指定null值处理规则,反序列化时自动将null的List转为空列表:
@Data class Cart{ int cartId; @JsonSetter(nulls = Nulls.AS_EMPTY) List<Item> items; }
使用ObjectMapper生成对象时,即使JSON中无对应字段或字段为null,都会得到空列表:
ObjectMapper mapper = new ObjectMapper(); Cart cart = mapper.readValue("{}", Cart.class); // items为空列表
方式2:ObjectMapper转换已有对象
如果已经创建了Cart对象(List字段为null),可通过配置ObjectMapper批量将null转为空列表:
ObjectMapper mapper = new ObjectMapper(); mapper.configOverride(List.class) .setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY)); Cart cart = new Cart(); Cart filledCart = mapper.convertValue(cart, Cart.class); // filledCart中所有List字段均为非空列表
方式3:Spring BeanWrapper批量赋值
借助Spring的BeanWrapper遍历字段,为null的List属性赋值空列表:
BeanWrapper wrapper = new BeanWrapperImpl(new Cart()); for (PropertyDescriptor pd : wrapper.getPropertyDescriptors()) { if (List.class.isAssignableFrom(pd.getPropertyType())) { if (wrapper.getPropertyValue(pd.getName()) == null) { wrapper.setPropertyValue(pd.getName(), new ArrayList<>()); } } } Cart cart = (Cart) wrapper.getWrappedInstance();
内容的提问来源于stack exchange,提问作者SmlCodes
相关产品推荐
相关产品推荐

