Enum Singleton构造函数中的Class.forName

时间:2014-09-13 10:37:09

标签: java jdbc enums singleton

我正在尝试使用Enum Singleton实现ConnectionFactory,并在加载数据库驱动程序(Class.forName)时遇到一个奇怪的问题。现在,我知道,辛格尔顿是一个有争议的模式,并不是每个人都喜欢它,是的,我也不是一个大粉丝。但这仅用于说明目的。

这是我的主要代码:

public class HelloWorld {

    public static void main(String[] args) {
        ConnectionFactory.getConnection();
    }
}

ConnectionFactory:

public enum ConnectionFactory {
    INSTANCE;

    // Database details
    private static final String JDBC_DRIVER_PARAM="org.h2.Driver"; 
    private static final String DB_URL_PARAM="jdbc:h2:file:./h2database/homedb";
    private static final String DB_USER_PARAM="admin";
    private static final String DB_PASS_PARAM="pass";

    private ConnectionFactory()  {
        try {               
            Class.forName(JDBC_DRIVER_PARAM);
            System.out.println("Driver Loaded!");

        } catch (ClassNotFoundException e) {
            System.out.println(e);        
        }
    }

    private Connection createConnection() {
        Connection conn = null;
        try{            
            conn = DriverManager.getConnection(DB_URL_PARAM, DB_USER_PARAM, DB_PASS_PARAM);
        }catch (Exception e) {
            System.out.println(e);
        }
        return conn;
    }

    //public method to obtain connection
    public static Connection getConnection() {
        return INSTANCE.createConnection();
    }
}

这是输出:

java.lang.ClassNotFoundException: org.h2.Driver 

虽然,下面工作正常 - 所以它绝对不是类路径问题。我从Eclipse运行这两种方法,它是相同的maven项目,因此没有依赖项问题。

public class HelloWorld {

    public static void main(String[] a) throws Exception {
        Class.forName("org.h2.Driver");
        Connection conn = DriverManager.getConnection("jdbc:h2:file:./h2database/homedb", "admin", "pass");
        System.out.println("Connected");
        conn.close();
    }
}

这是输出:

Connected

我可以在两种方法之间看到唯一真正的区别是使用Enum Singleton。所以我的问题是:当我使用Enum Constructor中的Class.forName()时,是否存在具体的问题?我想,当枚举由类加载器加载时,构造函数被调用,并且应该能够在类路径上使用其他类。我在这里错过了什么吗?

0 个答案:

没有答案