由于实体类自身设计的原因导致了java自身List的循环嵌套
public class SequenceControlUnit extends Observable implements Observer {
@ApiModelProperty("所属任务id")
@JSONField(serializeUsing = ToStringSerializer.class)
private Long taskId;
// 需要通过该操作步骤主键去判断操作结果
@ApiModelProperty("一键顺控操作步骤主键")
@JSONField(serializeUsing = ToStringSerializer.class)
private Long sequenceControlOperateId;
// 需要通过该操作顺序确定观察者链
@ApiModelProperty("操作顺序")
private Integer operateOrder;
@ApiModelProperty("操作内容")
private String operateContent;
@ApiModelProperty("预期目标")
private String expectedTarget;
@ApiModelProperty("实际成功结果")
private String actualSuccessResult;
@ApiModelProperty("实际失败结果")
private String actualFailResult;
@ApiModelProperty("实际结果")
private String actualResult;
// 所关联的设备是否在运行
@ApiModelProperty("量测状态")
private Integer measurementStatus;
// 需要通过该结果通知观察者
@ApiModelProperty("单步结论")
private String status;
// 摄像头列表
@ApiModelProperty("摄像头列表")
private List<SequenceControlCameraInfo> sequenceControlCameraInfoList;
// 所在的单元列表
@ApiModelProperty("单元列表")
@JSONField(serialize = false)
private List<SequenceControlUnit> unitList;
}
// 2.创建观察者链
for (int i = 0; i < unitList.size(); i++) {
SequenceControlUnit unit = unitList.get(i);
unit.setTaskId(taskId);
unit.setSequenceControlCameraInfoList(groupByOperateId.get(unitList.get(i).getSequenceControlOperateId()).stream().distinct().collect(Collectors.toList()));
unit.setUnitList(unitList);
if (i != unitList.size() - 1) {
unit.addObserver(unitList.get(i + 1));
}
}
这样会有问题吗?
list本身只是一个引用
如果list里的某一项是它自身,本身不会有任何问题
但是千万别对它进行递归,那就造成无穷递归
当然这说的仅仅是就定义层面上它是没问题的,实际使用中,涉及修改、删除某一项,那又很可能产生更多的问题
所以最好从源头上杜绝这种可能性
这么定义属性肯定是有问题的了。
在自身类中定义自身类的集合属性,会导致回环。
public class SequenceControlUnit extends Observable implements Observer {
.....
private List<SequenceControlUnit> unitList;
}
你这样当然会有问题,for 循环遍历的是 unitList,然后下面根据条件再往里添加新对象,而对象实例中又包含unitList,如果这种对象无限增长,再加上嵌套,栈溢出是必然的结果。一种解决方案是,这种嵌套最好也仅适用于“有限的树”结构,比如部门的结构或有限N叉树等。所以,如果你能预知这种数据量不为 StackOverFlow的话,是可以这么做,但前提是避免重复引用,比如某个unitList 存储了对象 SequenceControlUnit,接着它当中又嵌套了该集合,就会出现互相引用,死循环!