枚举、单例和反序列化

Posted

技术标签:

【中文标题】枚举、单例和反序列化【英文标题】:Enums, Singletons and Deserialization 【发布时间】:2012-10-24 13:19:26 【问题描述】:

枚举被认为是单例的最佳方式,原因之一是它隐式继承了Serializable

但是枚举如何防止单例的反序列化问题?

【问题讨论】:

枚举是单例,但是单例的反序列化有什么问题? @clinton:如果你让一个单例可序列化,并且不关心它是如何反序列化的,那么每次反序列化时,你都会增加一个新的单例实例,这会破坏它的单例。跨度> @JBNizet 感谢您提供的信息。在此之前,我还没有查看过关于单身人士的问题。或者它可能没有让我觉得很重要。 【参考方案1】:

序列化机制在special, specific way 中处理它们。但是通过定义一个返回唯一实例的readResolve() 方法,可以很好地反序列化传统的单例。示例见http://www.oodesign.com/singleton-pattern.html

【讨论】:

【参考方案2】:

将序列化作为将枚举用于单例的参数是无稽之谈。

如果枚举单例是有状态的,则在序列化/反序列化过程中状态会丢失。

如果单例是无状态的,谁在乎它的身份?

【讨论】:

如果单例是无状态的,并且代码使用(例如)if (someVar == SomeSingleton.INSTANCE),你真的很关心它的身份。 没有真实世界的用例。 Jushua Bloc 编造了这件事。通常单例不应该是可序列化的,使用枚举来促进序列化是错误的。另外,单例是一种实现策略,不应该在接口上宣传。

以上是关于枚举、单例和反序列化的主要内容,如果未能解决你的问题,请参考以下文章

单例模式防止反射和反序列化

你如何序列化和反序列化枚举?

Jackson:将枚举值序列化和反序列化为整数

如何将远程 crate 的枚举序列化和反序列化为数字?

unity含枚举类型json数据的序列化和反序列化

unity含枚举类型json数据的序列化和反序列化