java - 纪念品模式 - 在纪念品中恢复复杂对象(JAVA)

标签 java design-patterns pass-by-reference pass-by-value memento

感谢您阅读这个问题。请帮我解决这个复杂的问题。

情况是这样的:

Oringator 持有一个对象来执行一些方法。

Memento模式需要在oringator中备份复杂的对象状态,如何实现?

示例代码:

http://pastebin.com/4rV2aw3B

问题是,java确实按值传递,不按引用传递。 但是对象传递有点棘手。 如果我将一个对象传递给方法,虽然该方法持有对象的新内存地址,但内存地址仍然指向传入的同一个对象。 看这个例子: http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.html

如果我创建备忘录并将该对象传递给新的备忘录对象,备忘录对象仍然包含原始的复杂对象(需要备份)。

那么,如何创建备忘录模式来备份命令模式中的复杂对象呢?

谢谢。

最佳答案

Memento pattern needs to backup the complex object state in oringator.How?

我假设意图是 Memento 应该保存 differentObj 状态的副本......

没有神奇的解决方案。相反,它取决于 differentObj 是什么。

  • 如果它是不可变的,那么根本不需要复制它。

  • 如果它有复制构造函数或克隆方法,您可以使用它,模数构造函数/方法具有所需的复制语义。

  • 如果它实现了Serializable或者Externalizable,那么你可以使用Java Object Serialization,并使用序列化后的对象来表示保存的状态,

  • 您可以编写自定义序列化程序,或使用 Java 到 JSON 或 XML 绑定(bind)。


请注意,(假设的)引用调用不一定能解决问题。您还需要某种形式的复制构造函数(或类似的)来允许进行复制……并且您将依赖于具有正确语义的构造函数。

关于java - 纪念品模式 - 在纪念品中恢复复杂对象(JAVA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20053570/

相关文章:

pointers - golang 和指针接收器中的自定义错误

java - Java 中的基元与对象

java - 返回一个迭代器

C++ 非常量-常量引用函数重载

java - 检查指定时间内的变量变化?

java - 使用 Android 向 API 发送信息

design-patterns - 为什么人们不首先采用 WSDL?

c++ - 用C++设计一个状态机

java - Jersey REST 2.0 异步请求在底层容器中失败(Tomcat 7)

使用 Java SWING 的 Java 2d 游戏