在java中定义单例以用于资源尝试

时间:2013-04-14 17:42:24

标签: java singleton try-catch

我的目标是将 try-with-resource 构造与一个类的单个实例一起使用,即 singleton ,它处理一个连接池。我需要这个以确保连接池在所有内容结束时关闭,然后我想使用 try-with-resource 。 E.g。

public class MyHandler implements java.io.Closeable{

   public static ConnectionPool pool;

   //Init the connection pool
   public MyHandler(){
      pool = ...;
   }

    @Override
    public void close() {
        pool().close();    
    }
}

可能的main是:

public static void main(String [] args){
  try(MyHandler h = new MyHandler){
     //execute my code
     // somewhere I do MyHandler.pool.something();
  }
}

如何确保将MyHandler用作单例?

3 个答案:

答案 0 :(得分:5)

我看到确保类是单例的常用方法是将其构造函数设置为private,然后使用公共静态getInstance方法来检索单例。

public class MyHandler implements java.io.Closeable {
    private static MyHandler singleton = new MyHandler();
    private MyHandler() {}
    public static MyHandler getInstance() {
        return singleton;
    }

    @Override
    public void close() {
        //close stuff  
    }
}

try(MyHandler h = MyHandler.getInstance()){ }

Spring Framework也有一个很好的系统来定义单例。

答案 1 :(得分:1)

如果您需要的是单例类,则应该将构造函数设为私有,并创建一个名为getInstance()的公共方法和一个私有属性MyHandler实例(或您想要的任何名称)。然后,getInstance方法调用构造函数" MyHandler()"如果instance为null或未定义。最后,它返回实例属性。

答案 2 :(得分:1)

声明类单例有很多种方法,但这种方法有局限性。单身人士的最佳方式是ENUM。声明ENUM,其余部分将自动处理。