感谢您阅读此问题。请帮我解决这个复杂的问题。
情况如下:
Oringator拥有一个执行某种方法的对象。
Memento模式需要在oringator中备份复杂的对象状态。如何?
示例代码:
问题是,java确实通过值传递,不通过引用传递。 但是对象传递有点棘手。 如果我将一个对象传递给方法,虽然该方法保存了一个新的对象的记忆地址,但是内存地址仍然指向传入的同一个对象。 看这个例子: http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.html如果我创建纪念品并将对象传递给新的纪念品对象,纪念品对象仍然保留了原始复杂对象(需要备份)。
那么,如何创建memento模式来备份命令模式中的复杂对象?
谢谢。
答案 0 :(得分:6)
Memento模式需要在oringator中备份复杂的对象状态。如何?
我认为意图是纪念品应该保留differentObj
州的副本......
没有神奇的解决方案。相反,它取决于differentObj
是什么。
如果它是不可变的,则根本不需要复制它。
如果它有复制构造函数或克隆方法,您可以使用它,模数构造函数/方法具有所需的复制语义。
如果它实现了Serializable
或Externalizable
,那么您可以使用Java对象序列化,并使用序列化对象来表示已保存的状态,
您可以编写自定义序列化程序,或使用Java到JSON或XML绑定。
请注意,(假设的)引用呼叫不一定能解决问题。您还需要某种形式的复制构造函数(或类似的)来允许复制...并且您将依赖于具有正确语义的构造函数。
答案 1 :(得分:0)
您是否尝试过克隆Memento对象?