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 具有特定类型的泛型,另一个优点是您不必执行此类型转换。
我希望构建一个通用的 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 具有特定类型的泛型,另一个优点是您不必执行此类型转换。