Java 将资源移出“试用”

Java 将资源移出“试用”,java,try-with-resources,Java,Try With Resources,我想创建一个封装资源的类实例。问题是:当构造函数抛出时,资源将丢失。我正试图找到解决办法。Try-with-resource是一个看起来不错的构造,但我无法将资源移出它 例如,包装HTTP客户端的服务客户端: class ServiceClient implements Closeable { ServiceClient(ClosableHTTPClient client) { /* ... */ } public close() { client.close() } public

我想创建一个封装资源的类实例。问题是:当构造函数抛出时,资源将丢失。我正试图找到解决办法。Try-with-resource是一个看起来不错的构造,但我无法将资源移出它

例如,包装HTTP客户端的服务客户端:

class ServiceClient implements Closeable {
  ServiceClient(ClosableHTTPClient client) { /* ... */ }
  public close() { client.close() }

  public ServiceClient create(String url) throws IOException {
    try (ClosableHTTPClient client = createHttpClient(url)) {
      return new ServiceClient(client);
    }  // make try-with do not close `client` on success
  }

  public ClosableHTTPClient createHttpClient(String url) {
    return HttpClientBuilder.create()
        .setConnectionManager(createClosableConnectionManager()) // must be closed, when `build` throws 
        .build();
  }
}
引发异常的构造函数。

唯一的解决方案是处理构造函数中抛出的任何异常。
事件标准java类有时会忘记(具有负容量的BufferedReader不会关闭其包装的读取器)。

您当前的伪代码没有意义。当
create
完成时,它所创建的东西包含一个已关闭的客户端包装。“尝试使用资源”是一种在资源完成时总是关闭资源的功能。这似乎与你想要的正好相反。但是我不明白你的意思question@Michael这是我的问题:我希望它只在存在异常时关闭它。
class Foo implements AutoClosable {

    private final Bar someResource;

    /**
     * @param someResource whose ownership is taken over.
     */
    Foo(Bar someResource) {
        this.someResource = someResource;
        try {
            ...
        } catch (Throwable e) {
            someResource.close(); // If this.close is not final.
            throw e;
        }
    }

    @Override public void close() { someResource.close(); }
    ...