Быстрый ответ: нет. GC не заботится о Closeable
вообще.
В Java есть protected void finalize() throws Throwable { }
метод, который вы можете переопределить - и он будет вызываться в GC. Это вроде работает, например в FileInputStream
:
/**
* Ensures that the <code>close</code> method of this file input stream is
* called when there are no more references to it.
*
* @exception IOException if an I/O error occurs.
* @see java.io.FileInputStream#close()
*/
protected void finalize() throws IOException {
if ((fd != null) && (fd != FileDescriptor.in)) {
/*
* Finalizer should not release the FileDescriptor if another
* stream is still using it. If the user directly invokes
* close() then the FileDescriptor is also released.
*/
runningFinalize.set(Boolean.TRUE);
try {
close();
} finally {
runningFinalize.set(Boolean.FALSE);
}
}
}
Проблема в том, что это создает больше проблем, чем стоит: например, JVM не гарантирует, что когда-либо вызовет этот метод. То есть вы никогда не должны использовать его для обработки ресурсов; то, что вы видите выше, является сетью безопасности, которая делает утечки обработчика файлов менее разрушительными.
Еще одна проблема будет, статическое поле не будет собирать мусор - то есть, пока ваш класс виден. Таким образом, у вас нет шансов использовать финализацию.
Однако вы можете использовать Runtime.addShutdownHook()
- это добавит еще один уровень защитных сетей в ваше приложение, что даст вам возможность корректно закрыть соединение при выходе. Учитывая, что вы используете статическое поле, срок службы вашего соединения, скорее всего, будет таким же, как и у JVM.
Я бы порекомендовал пересмотреть подход.