java - java.io.Serializable 是如何成为 Memento 模式的?

标签 java design-patterns serializable memento

正如我们所知,备忘录模式不会违反封装、捕获和外部化对象的内部状态,并且可以在不知道原始状态的情况下回收。

我的问题是 java.io.Serializable 是如何在这种模式下出现的,因为每当我们序列化任何私有(private)变量并将对象状态写入文件时同时私有(private)变量的值对世界开放,封装似乎在这里失败了。

最佳答案

<罢工>Wikipedia article on the Memento pattern没有提到任何关于封装的事情,事实上,那里给出的例子准确地捕获了 Memento 中私有(private)变量中保存的状态。

封装(“一种限制访问某些对象组件的语言机制”)是指您必须如何编写代码才能更改对象的内部状态。

然而,对象的内部状态可以由外部输入确定,例如字符串的内容取决于从中读取的文件或从网络接收到的数据。复选框的状态取决于用户是否选中它,而类中的相应字段可能具有私有(private)访问权限,并且该状态对于其他类可能是只读的。

通过将字段置于私有(private)访问之下来保护字段旨在帮助开发人员将对象的状态保持在一致的状态,即避免字段被该类外部的代码设置为不一致的状态(例如,如果字段的值A 取决于字段 B 的值)。

就此数据被视为 secret 而言,它与“隐私”无关。当然,可以编写另一个类,然后读取序列化的私有(private)字段并使它们在不同的类中公开可用,或者您甚至可以编辑序列化文件,但我不确定这样做会带来什么好处。

关于java - java.io.Serializable 是如何成为 Memento 模式的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6609746/

相关文章:

java - 说服 java 通过 SSL 与 "localstack"对话

c++ - 访客模式+开放/封闭原则

java - 如何在 maven-surefire-plugin 中设置并行测试

java - 如何在cache2k中定义持久存储?

design-patterns - GWT 2.1 中包含的 MVP 框架是否使其他 GWT MVP 框架变得多余?

python - 如何设计插件架构,其中插件填充网页的不同部分?

c++ - 序列化 lua_State 以通过网络发送

postgresql - 为什么 PostgreSQL 中止这个可序列化的计划

android - 设置 minifyEnabled true 后 NotSerializableException : kotlin. UNINITIALIZED_VALUE

java - 动态添加新过滤器