【问题标题】:Is there a standard Java Receiver/Handler interface?是否有标准的 Java Receiver/Handler 接口?
【发布时间】: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。 (感谢我没有在问题中指定)
  • 听起来有点像ObservableObserver.update(Observable, Object),遗憾的是它们不是通用的。

标签: java


【解决方案1】:

Java 8 有接口java.util.function.Consumer&lt;T&gt;

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

【讨论】:

  • 只是为了澄清,因为我发现命名(消费者)有点混乱。这个接口的目的正是它在这里所要求的:“表示一个接受单个输入参数并且不返回结果的操作。”
  • 是的,看起来消费者符合要求。我目前无法使用 Java 8,但这可以在理清升级的原因列表中列出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
相关资源
最近更新 更多