枚举、单例和反序列化
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 编造了这件事。通常单例不应该是可序列化的,使用枚举来促进序列化是错误的。另外,单例是一种实现策略,不应该在接口上宣传。以上是关于枚举、单例和反序列化的主要内容,如果未能解决你的问题,请参考以下文章