我想要创建一个包装资源的类实例。问题:当构造函数抛出时,资源就会丢失。我想找个解决办法。尝试资源是一个看起来很好的构造,但我不能将资源移出它。
例如,包装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();
}
}发布于 2020-09-11 09:41:44
--引发异常的构造函数.
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(); }
...唯一的解决方案是处理构造函数中抛出的任何异常。有时会忘记标准java类(容量为负值的BufferedReader不会关闭包装好的读取器)。
https://stackoverflow.com/questions/63844348
复制相似问题