SonarQube提示需存储allergenInfoList副本的代码问题咨询
告警问题成因说明
- 根本原因是可变集合引用泄漏,Java 中的
List属于引用数据类型,你当前的代码直接将构造方法入参的allergenInfoList的内存地址赋值给类的成员变量,会引发两类潜在问题:- 外部持有原始入参引用的代码,后续对该List做增删改操作时,会直接同步修改DTO内部的
allergenInfoList值,破坏DTO的状态稳定性,尤其你使用了@Data注解生成了Setter方法,更容易出现不可预期的状态篡改问题。 - 如果传入的List是其他业务上下文的复用对象,会导致该List的生命周期被DTO意外延长,极端场景下会引发内存泄漏。
- 外部持有原始入参引用的代码,后续对该List做增删改操作时,会直接同步修改DTO内部的
- 网上提到的
Collections.emptyList()初始化方案之所以能规避告警,是因为Collections.emptyList()返回的是不可变集合,从初始化阶段就切断了和外部传入集合的引用关联,只是该方案不符合你的项目规范,你可以选择其他拷贝引用的方式修复:- 如果项目允许使用JDK9+的不可变集合API,可直接在构造方法内写:
this.allergenInfoList = allergenInfoList == null ? Collections.emptyList() : List.copyOf(allergenInfoList); - 如果需要保留集合可变性,可采用ArrayList拷贝写法:
this.allergenInfoList = allergenInfoList == null ? new ArrayList<>() : new ArrayList<>(allergenInfoList);
- 如果项目允许使用JDK9+的不可变集合API,可直接在构造方法内写:
这条SonarQube规则的核心目的是保证类内部的集合状态不受外部代码的意外修改,提升类实例的状态安全性。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

