Java 在 HashMap 中存储连接

Java Store a Connection in a HashMap

我希望构建一个通用的 HashMap 来存储一些东西,其中之一是连接对象。这是一个简化的例子:

初始化函数

public Map<Object, Object> genObjectInit() {

   Map<Object, Object> genObject = new HashMap<Object, Object>();

}

添加连接对象(作为示例)

public Map<Object, Object> genObjectConnect(Map<Object, Object> genObject) throws Exception {

   Connection PgSQL;

   try {
      Class.forName("org.postgresql.Driver");
      PgSQL = DriverManager.getConnection ( /* yes */ );
   } catch(Exception log) {
      throw new Exception("failed to connect");
   }

   genObject.put("PgSQL", PgSQL);

   return genObject;

}

测试它是否正常工作

public void genObjectTest(Map<Object, Object> genObject) {

   genObject.put("Yes", "Yes");

   System.out.println(genObject.get("PgSQL").getClass().getName());
   genObject.get("PgSQL").close();


}

将 Connection 添加到 HashMap 似乎有效,genObject.get("PgSQL").getClass().getName() 的输出给了我 org.postgresql.jdbc.PgConnection,我认为这意味着它仍然是一个 Connection 对象,但调用 genObject.get("PgSQL").close(); 崩溃了与

/yes/yes/yes.java:45: error: cannot find symbol
   genObject.get("PgSQL").close();
                         ^

我显然误解了这里的内容。我如何使用一般存储的连接(或等效但同样独特的对象)的功能?

使用 Map<Object, Object> 可以访问对象 class 中声明的方法,因为当您从映射中检索对象时

public void genObjectTest(Map<Object, Object> genObject) {

   genObject.put("Yes", "Yes");

   System.out.println(genObject.get("PgSQL").getClass().getName());
   genObject.get("PgSQL").close();


}

然后 genObject.get("PgSQL") 的结果存储在对象 class 的实例中。

根据您的用例,您可以尝试使用具有特定类型的 Java 泛型,并将您的地图声明为 Map<Object, Connection>,如下所示:

    public void genObjectTest(Map<Object, Connection> genObject) {

        genObject.put("Yes", connectionInstance);

        System.out.println(genObject.get("PgSQL").getClass().getName());
        Connection pgSQL = genObject.get("PgSQL");
        try {
            pgSQL.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

这给了你很多优势,其中之一是 compile-time 类型检查,或者你最终可以在检索对象时进行类型转换,例如:

public void genObjectTest(Map<Object, Object> genObject) {

    genObject.put("Yes", "Yes");

    System.out.println(genObject.get("PgSQL").getClass().getName());
    Object connectionAsObject = genObject.get("PgSQL");
    if (connectionAsObject instanceof Connection) {
        Connection pgSQL = (Connection) connectionAsObject;
        try {
            pgSQL.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

然而,这是不太受欢迎的解决方案。使用第一个解决方案,即 java 具有特定类型的泛型,另一个优点是您不必执行此类型转换。