Java枚举式单例与静态实例的getter

dem*_*002 2 java singleton

我习惯于在突然间编写枚举式单例,有人审阅我的代码时要求我更改它,因为它不在项目的编码约定中.他问我有什么好处,我只是说写起来比较容易.

我只想知道使用它是否真的没有任何好处.我知道java的枚举可能没有为此目的实现,但即便如此,以这种方式使用它是错误的吗?

Ste*_*n C 5

我习惯于在突然间编写枚举式单例,有人审阅我的代码时要求我更改它,因为它不在项目的编码约定中.他问我有什么好处,我只是说写起来比较容易.

枚举式单例相对于经典单体的另一个好处是它们在Java对象序列化中具有单例语义.(Java对象序列化和枚举基类结合起来确保反序列化不会创建枚举常量的副本.对于以经典方式实现的单例,很难做到这一点.如果你弄错了,可以有一些单例类的多个实例......以及潜在的问题.)

但我倾向于仔细研究同事反对的依据.

  • 编码风格是否特别禁止枚举?
  • 编码风格是否特别禁止枚举式单身人士?
  • 编码风格是否明确规定了实施单身人士的特定方式?

如果以上都不是,则"不在编码标准中"听起来不像是有效的异议.(当然,某些东西不需要明确地"在"允许的编码标准中......这将是控制狂的疯狂东西!)

我的猜测是你的同事在你的编码标准中发现了一个单例的例子,并且(错误地)得出结论,这意味着必须以这种方式实现单身人士.

(或许你真的被一个过于规范的编码标准困扰.如果是这样的话,你会得到我的同情.)


另一点是Singleton模式需要谨慎使用,因为它是可测试性的障碍,并且对于部署在Web容器等中的应用程序可能存在问题.