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

时间:2011-04-05 07:15:25

标签: java singleton

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

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

4 个答案:

答案 0 :(得分:5)

  

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

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

但我倾向于仔细研究同事反对的基础。

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

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

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

(或许你真的对一个过于规范的编码标准感到沮丧。如果是这样的话,你会得到我的同情。)


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

答案 1 :(得分:3)

您可以参考:

Item 3 of Effective Java 2nd --  Enforce the singleton property with a private constructor or an enum type

对此问题进行了全面而详细的讨论。

答案 2 :(得分:0)

你是对的。良好的编码约定与优雅的代码一样有价值。您的任务是在将新样式添加到潜在的大项目之前,将您的想法引入编码约定并首先进行更改。

你不应该有50种声明单身的方式,这些方式被一些人视为反模式。

答案 3 :(得分:0)

  

我可以在晚上睡觉而不必担心我的单身人士会变成   未来的mulitpleton

请确保没有人会为您的Enum单身人士添加另一个Enum值,因此您最终不会这样:

public enum MySingleton{ 
// Should only have one INSTANCE, so please! don't add more values here 
INSTANCE, INSTANCE2,INSTANCE3,... etc ;