可以使用泛型+函数式接口封装try-with-resources逻辑,定义UseResource接口和use静态方法实现资源自动管理,支持类型安全、异常传播及多资源组合调用。

可以直接用泛型 + 函数式接口封装,让 try-with-resources 的资源管理逻辑复用,同时保持代码简洁、类型安全。
定义统一的资源操作接口
Java 自带的 AutoCloseable 是基础,但我们需要一个能接收资源并执行业务逻辑的函数式接口:
@FunctionalInterface
public interface UseResource<T extends AutoCloseable, R> {
R apply(T resource) throws Exception;
}
这个接口接受一个可关闭资源,返回任意结果(比如 String、int 或 void),且允许抛出异常(便于调用方处理)。
封装 try-with-resources 的静态工具方法
写一个泛型静态方法,内部完成资源创建、使用、自动关闭全流程:
立即学习“Java免费学习笔记(深入)”;
public class ResourceUtil {
public static <T extends AutoCloseable, R> R use(
Supplier<T> resourceSupplier,
UseResource<T, R> operation) throws Exception {
try (T resource = resourceSupplier.get()) {
return operation.apply(resource);
}
}
}
说明:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
Supplier<t></t>负责创建资源(如() -> new FileInputStream("a.txt")) -
UseResource描述对资源的操作(如读取、解析、写入) - 方法签名保留了异常传播能力,调用方可以
try-catch或声明抛出
实际调用示例
比如读取文件内容:
String content = ResourceUtil.use(
() -> new FileInputStream("data.txt"),
fis -> {
byte[] buf = new byte[1024];
int len = fis.read(buf);
return new String(buf, 0, len);
}
);
再比如操作数据库连接(假设 Connection 实现了 AutoCloseable):
Integer count = ResourceUtil.use(
() -> dataSource.getConnection(),
conn -> {
try (PreparedStatement ps = conn.prepareStatement("SELECT COUNT(*) FROM users")) {
try (ResultSet rs = ps.executeQuery()) {
rs.next();
return rs.getInt(1);
}
}
}
);
注意:这里 conn 由外层 try-with-resources 管理;内部的 PreparedStatement 和 ResultSet 可继续用传统方式或嵌套调用 ResourceUtil.use。
支持无返回值和多资源扩展(可选)
如果操作不返回值,可用 Consumer 替代:
public static <T extends AutoCloseable> void use(
Supplier<T> resourceSupplier,
Consumer<T> action) throws Exception {
try (T resource = resourceSupplier.get()) {
action.accept(resource);
}
}
多个资源时,可叠加调用或设计变参版本(如 use(() -> res1, () -> res2, (r1, r2) -> {...})),但需注意资源创建顺序和异常安全 —— 推荐优先用单资源封装,组合调用更清晰可控。

















