我反复发现自己想要使用如下所示的界面:
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
。番石榴Supplier
恰恰相反,但没有Receiver
。
是否有一些我错过了这种结构的核心接口?我在某种程度上做了其他人认为有些过分的事情吗?
我注意到在C#上下文中提出了完全相同的问题:Does this interface already exist in the standard .NET libraries?
答案 0 :(得分:5)
Java 8具有接口java.util.function.Consumer<T>
。
如果你不能使用Java 8,但你有Guava,它有点像com.google.common.base.Function<T, Void>
。是的,我知道这看起来有点臭,但它确实与你想要的一样。