gpt4 book ai didi

java - 将对象转换为它们未实现但具有相同方法签名的接口(interface)

转载 作者:行者123 更新时间:2023-11-30 06:36:42 25 4
gpt4 key购买 nike

请查看以下 DbUtil 类示例。这是它的三个方法

public static void closeResults(ResultSet rs) {
if (rs != null) {
try {
if (!rs.isClosed()){
rs.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

public static void closeStatement(Statement stmt) {
if(stmt != null) {
try {
if (!stmt.isClosed()) {
stmt.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

public static void closeConnection(Connection conn) {
if(conn != null) {
try {
if(!conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

正如你所看到的,所有 3 种方法都有相同的逻辑,我想让这段代码变得干燥。一个新的通用方法可以这样写

public static void closeStatement(AutoCloseable ob) {
if(ob != null) {
try {
ob.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

AutoCloseable 接口(interface)不包含 isClosed 方法。但在尝试关闭资源之前执行该检查仍然是一个很好的做法(甚至必须这样做)。我对吗?代码可以以某种方式简化并仍然执行 isClosed 检查吗?

注意。这只是问题的一个例子。我知道 AutoCloseable 接口(interface)是为 try-with-resources 技术而设计的,因此可以使用该样式重写代码,并且不再需要 DbUtil 。但我想自己澄清是否有可能在类似的情况下做一些事情。例如,我会考虑创建一些接口(interface),例如 MyAutoCloseable,扩展 AutoCloseable 接口(interface)并具有 isClosed 方法,但肯定不会有效,因为无法将 ResultSetStatement 转换为 MyAutoCloseable

最佳答案

您根本不需要调用isClosed()。 20 年来我在 JDK 中见过的每个 close() 方法都是幂等的,这意味着您可以调用它两次或更多次而不会造成任何损害。

关于java - 将对象转换为它们未实现但具有相同方法签名的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45098891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com