Java中简化的单例模式

Tom*_*ito 4 java singleton design-patterns

实现单例模式的默认方法是:

class MyClass {
  private static MyClass instance;
  public static MyClass getInstance() {
    if (instance == null) {
      instance = new MyClass();
    }
    return instance;
  }
}
Run Code Online (Sandbox Code Playgroud)

在一个旧项目中,我试图简化写作:

class MyClass {
  private static final MyClass instance = new MyClass();
  public static MyClass getInstance() {
    return instance;
  }
}
Run Code Online (Sandbox Code Playgroud)

但它有时会失败.我只是不知道为什么,我做了默认的方式.让SSCCE今天在这里发布,我意识到代码是有效的.

所以,我想知道意见..这是一个随意的失败代码吗?第二种方法是否有可能返回null?我疯了吗?

- 虽然我不知道每个案例的答案是否正确,但@Alfred的回答非常有趣: 我还想指出,单身人士正在测试噩梦,根据大家伙的说法,你应该使用谷歌的依赖性注射框架.

Chr*_*ung 8

推荐(通过Effective Java 2nd ed)方法是执行"枚举单例模式":

enum MyClass {
    INSTANCE;

    // rest of singleton goes here
}
Run Code Online (Sandbox Code Playgroud)

这里的关键见解是枚举值是单实例,就像单例一样.因此,通过制作一个单值枚举,你只需要让自己成为一个单身人士.这种方法的优点在于它完全是线程安全的,并且它还可以安全地防止任何允许人们创建其他实例的漏洞.

  • 可怕.仅仅因为所有的枚举都是单身并不意味着每个单身都必须是一个枚举.创建一个不是enum作为枚举的单例是可怕的误导. (5认同)
  • @Software Monkey - 与Java语言设计师一起讨论模式"enum"或Joshua Bloch.这不是在Java中使用最佳版本的Singleton模式的好理由(后1.5版)(而且通常没有理由使用Singleton模式......) (2认同)