【发布时间】:2023-03-03 13:00:01
【问题描述】:
我反复发现自己想要使用如下所示的界面:
interface Handler<T> {
void handle(T toHandle);
}
在您希望围绕资源强制执行 try-finally 结构而不依赖 API 用户执行此操作的情况下,它特别有用。
您的 API 实现可能如下所示:
public void loadResource(Handler<SomeResource> resourceHandler) {
SomeResource r = fetchTheResource();
try {
resourceHandler(r);
finally {
r.close();
}
}
...API 使用者可以安全地做:
loader.loadResource(new Handler<SomeResource>() {
public void handle(SomeResource resource) {
// use the resource, no need to worry about closing it.
}
});
我知道Closeable 接口。这不是很通用 - 它不能强制消费者正确关闭资源。
接口可能同样被称为Receiver。 Guava 有Supplier,这几乎是相反的,但没有Receiver。
是否有一些我错过了具有这种结构的核心接口?我是不是在做一些其他人都认为矫枉过正的事情?
我注意到在 C# 上下文中提出了完全相同的问题:Does this interface already exist in the standard .NET libraries?
【问题讨论】:
-
不知道我是否从您的问题中得到了正确的想法,但是您是否在考虑类似访问者模式的东西?参见例如here
-
访客模式就是这样 - 一种模式。我想要的是一个与上面签名匹配的实际接口。
-
是的,看起来 Java 8 的 Consumer 符合要求。不幸的是,我还不能使用 Java 8。 (感谢我没有在问题中指定)
-
听起来有点像
Observable和Observer.update(Observable, Object),遗憾的是它们不是通用的。
标签: java