Как вы заметили, java.net.http.HttpClient
не реализует Closeable
или AutoCloseable
.Таким образом, я могу думать только о двух вариантах, но ни один из них не является действительно пуленепробиваемым или даже хорошим:
Вы можете исключить каждую сильную ссылку на HttpClient
, которую держит ваша программа и запросить сборку мусора .Однако существует реальный риск того, что что-то, находящееся за пределами вашего прямого контроля, удерживает его или один из его компонентов.Любые оставшиеся строгие ссылки будут препятствовать сборке мусора на объект, на который он ссылается, и любые объекты, на которые он содержит строгую ссылку.Тем не менее, это, возможно, более идиоматический вариант, чем альтернативный.
Я также нашел другой вариант .
final class HttpClientImpl extends HttpClient implements Trackable {
...
// Called from the SelectorManager thread, just before exiting.
// Clears the HTTP/1.1 and HTTP/2 cache, ensuring that the connections
// that may be still lingering there are properly closed (and their
// possibly still opened SocketChannel released).
private void stop() {
// Clears HTTP/1.1 cache and close its connections
connections.stop();
// Clears HTTP/2 cache and close its connections.
client2.stop();
}
...
}
Я бы не чувствовал себя комфортно, если бы ядругого выбора не было.Ваша ссылка, вероятно, имеет тип HttpClient
, поэтому вам нужно привести ее к HttpClientImpl
.Плохо полагаться на конкретную реализацию, которая может измениться в будущих выпусках, а не на интерфейс HttpClient
.Метод также является частным.Есть способы обойти это , но это грязно.