摘要 - 项目 89:优先使用枚举类型而非 readResolve 来控制实例

摘要 - 项目 89:优先使用枚举类型而非 readResolve 来控制实例

💡 原文约300字/词,阅读约需1分钟。
📝

内容提要

单例模式在序列化时可能导致多个实例的创建。可以通过readResolve方法替换实例,但存在安全隐患。使用枚举类型实现单例更安全,因为枚举隐式可序列化,确保只有一个实例。如果必须使用readResolve,需将字段设置为瞬态并调整访问权限。

🎯

关键要点

  • 单例模式在序列化时可能导致多个实例的创建。

  • 序列化会在反序列化时创建新实例,破坏单例的唯一性。

  • 可以使用readResolve方法替换反序列化的实例,但存在安全隐患。

  • 如果单例有非瞬态字段,攻击者可以在readResolve执行前捕获实例引用,导致多个实例的创建。

  • 使用枚举类型实现单例更安全,因为枚举隐式可序列化,确保只有一个实例。

  • Java禁止创建枚举常量之外的新实例。

  • 如果必须使用readResolve,需将字段设置为瞬态并调整访问权限。

  • 优先选择枚举实现单例,因为它安全且简单。

延伸问答

单例模式在序列化时会出现什么问题?

单例模式在序列化时可能导致多个实例的创建,破坏单例的唯一性。

如何使用readResolve方法解决单例模式的问题?

可以使用readResolve方法替换反序列化的实例,但需注意安全隐患。

使用枚举类型实现单例有什么优势?

使用枚举类型实现单例更安全,因为枚举隐式可序列化,确保只有一个实例。

如果必须使用readResolve,应该注意哪些安全措施?

需将字段设置为瞬态,并确保readResolve方法的访问权限适当。

Java如何防止枚举类型创建多个实例?

Java禁止创建枚举常量之外的新实例,确保枚举的唯一性。

在什么情况下仍然需要使用readResolve?

当类不能是枚举且需要控制实例时,可以使用readResolve。

➡️

继续阅读