Spring Boot绘图项目Stack存图异常:元素全被覆盖问题求助
问题分析与解决方案
核心问题原因
你遇到的问题本质是栈中存储的是同一个集合对象的引用,而非独立的副本。每次添加新图形时,你只是修改了同一个集合的内容,然后重复将这个集合的引用压入栈中。栈内所有元素指向的都是内存中的同一个集合,因此当集合内容更新后,栈里所有“元素”看起来都变成了最后添加的图形状态。
解决方案
要解决这个问题,关键是每次压栈时,创建当前图形集合的独立副本,而不是直接存入原集合的引用。
代码修正示例
错误写法(模拟你的问题场景):
private List<Shape> currentShapes = new ArrayList<>(); private Stack<List<Shape>> undoStack = new Stack<>(); public void addShape(Shape shape) { currentShapes.add(shape); undoStack.push(currentShapes); // 错误:存入的是同一个List的引用 }
正确写法:
private List<Shape> currentShapes = new ArrayList<>(); private Stack<List<Shape>> undoStack = new Stack<>(); public void addShape(Shape shape) { currentShapes.add(shape); // 创建新的ArrayList副本,复制当前集合元素后压栈 undoStack.push(new ArrayList<>(currentShapes)); }
进阶注意事项
如果你的Shape类是可变类(即对象内容可被修改),仅复制集合还不够,需要同时对每个Shape对象进行深拷贝:
// 假设Shape类实现Cloneable接口并重写clone方法 public void addShape(Shape shape) { // 先拷贝单个图形对象 Shape clonedShape = (Shape) shape.clone(); currentShapes.add(clonedShape); // 再拷贝整个集合 undoStack.push(new ArrayList<>(currentShapes)); }
也可以通过拷贝构造函数创建新的Shape对象,避免后续修改原对象影响栈中存储的历史状态。
内容的提问来源于stack exchange,提问作者Mohamed adel
相关产品推荐
相关产品推荐

