微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java将连接存储在HashMap中

如何解决Java将连接存储在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();
                         ^

我显然在这里误解了一些东西。如何使用一般存储的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();
        }
    }
}

有很多优点,其中之一是编译时类型检查,或者您最终可以在检索Object时进行类型转换,例如:

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泛型,另一个优点是您不必进行这种类型转换。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。