首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带Enum的Singleton与双检查锁定的Singleton

带Enum的Singleton与双检查锁定的Singleton
EN

Stack Overflow用户
提问于 2012-08-12 20:12:32
回答 3查看 3.1K关注 0票数 4

我想知道在多线程环境中哪个更好。我理解Singleton作为Enum类型在类加载时创建一个实例。除此之外,我看不出还有什么有意义的。有什么利弊吗?

Enum 类型的Singleton:

代码语言:javascript
复制
 public enum Singleton {
      INSTANCE;
      public void doSomething(){ ... }
 }

使用double-checked locking**:**的Singleton

代码语言:javascript
复制
 public class Singleton{
      private volatile static Singleton instance;

      private Singleton(){}
      public static Singleton getInstance(){
           if(instance == null){
                 synchronized(Singleton.class){
                       if(instance == null){
                           instance = new Singleton();
                       }
                 }
           }
           return instance;
      }

 }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-12 20:27:53

在多线程应用程序中,更简单、更容易理解代码更容易工作。

在我看来,第一个例子要比第二个简单得多,这才是最重要的。

使用enum的主要好处是它要简单得多,更复杂的例子是没有道理的。双锁示例允许您在单元测试中以有趣的方式更改单例,但我相信可以用另一种方式解决这一问题。

票数 5
EN

Stack Overflow用户

发布于 2012-08-12 21:33:53

单例存在更多的问题,而不仅仅是正确的实现。

人们经常使用单个对象,因此他们不必在任何地方传递对象,或者必须跨多个方法传递对象。

有很多例子可以用Singleton实例化jdbc连接。

在需要此连接的方法中,您可以轻松地访问它,因为它是一个Singleton。

代码语言:javascript
复制
public enum DBConnection {
  INSTANCE;
  private Connection connection;
  public Connection getConnection(){
    if(connection == null){
      instantiateConnection();
    }
    return connection;
  }
}

并通过

代码语言:javascript
复制
DBConnection.INSTANCE.getConnection();

但通常情况下,最好是使用依赖注入和一个愉快的框架。比如GUICE。

在您的代码中,您不会调用DBConnection.INSTANCE和getConnection(),您的类将有一个带有@Inject注释的字段DBConnection。你就用它吧。

代码语言:javascript
复制
@Inject
private DBConnection dBConnection;

类将被注释为@ Singleton,使其成为singleton,并且框架将确保它是单例。

如果您有不同的环境,比如,测试和生产,您可以让框架为每个环境注入不同的对象。

票数 2
EN

Stack Overflow用户

发布于 2012-08-12 20:51:10

使用enum创建singleton因为是的简单快捷的方法而越来越受欢迎。

此外,您还将这里与双重检查锁定()进行了比较,但也有其他方法,无需使用enum.。

eg:

代码语言:javascript
复制
public class Test{

      private static Test uniqueInstance = new Test();

      private Test(){}

      public static Test getInstance(){


             return uniqueInstance;     
         }

 }

但我认为enum singleton提供了一个更清晰的自我解释代码,这是一种非常直接的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11925539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档