簡體   English   中英

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();


}

將連接添加到 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();
                         ^

我在這里顯然誤解了一些東西。 如何使用通用存儲的 Connection(或等效但同樣獨特的對象)的功能?

使用Map<Object, Object>可讓您訪問 Object 類中聲明的方法,因為當您從地圖中檢索對象時

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")的結果存儲在 Object 類的實例中。

根據您的用例,您可以嘗試使用具有特定類型的 Java 泛型並將您的 Map 聲明為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();
        }
    }
}

這為您提供了許多優勢,其中之一是編譯時類型檢查,或者您最終可以在檢索對象時進行類型轉換,例如:

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 泛型,另一個優點是您不必進行這種類型轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM