我负责维护用Swing编写的旧应用程序,以及用Java3D编写的类似CAD的工具。我们遇到内存使用的问题。分析后,这与应用程序中的撤消功能有关。
所有撤消功能都是基于状态的,具有如下基本概念:
public class UndoAction {
private UndoTarget target;
private Object old_data;
private Object new_data;
}
创建这些UndoActions的代码基本上遍布整个应用程序。因为新对象的修改,现有对象的修改和子树的修改之间没有区别,所以会发生以下情况:
单个动作如下所示:
A
。foo
。一个新的UndoAction放在堆栈上,其中包含foo_old和foo_new。bar
。一个新的UndoAction放在堆栈上,其中包含bar_old和bar_new。B.setField(A)
。一个新的UndoAction放在堆栈上,其中包含field_old和field_new(== A)。根本没有粒度或任何控制权。这根本无助于维护。
我想重构这个系统,使其变得可维护且对内存友好。不幸的是,使用Command模式实现Undo系统是不可能的;这些行为太过影响而无法恢复。我想实现以下内容:
现在,我的问题: Java中是否已存在以上3种功能?我可以想象我不是第一个与基于状态的撤销和与之相关的问题(撤销分界,状态比较,......)进行斗争的人。
答案 0 :(得分:2)
在这个问题已经开放了很长一段时间后,似乎问题是:“不,没有这样的框架已经存在。”
作为其他人的指南,我正在研究Eclipse Modeling Framework和EMF.Edit框架。在此框架中,您使用描述符语言定义模型,框架为您处理模型和任何操作。这会自动导致创建动作和撤消/重做。
答案 1 :(得分:1)
作为参考,可以作为模型(如果不是解决方案)的另一个框架是UndoManager
,它支持有限数量的编辑。它是javax.swing.undo
包的一部分,是几个核心Text Component Features之一。