是否有标准的Java Receiver / Handler接口?

时间:2014-07-08 13:06:38

标签: java

我反复发现自己想要使用如下所示的界面:

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?

1 个答案:

答案 0 :(得分:5)

Java 8具有接口java.util.function.Consumer<T>

如果你不能使用Java 8,但你有Guava,它有点像com.google.common.base.Function<T, Void>。是的,我知道这看起来有点臭,但它确实与你想要的一样。