Правильный способ использования экземпляра AutoCloseable
с блоком try
-with-resources , поэтому ресурс надежно закрыт дажеесли выдается исключение.
Например:
try (OutputStream stream = new ...) {
... // use the resource
} catch (IOException e) {
... // exception handling code
}
Вы также можете управлять несколькими ресурсами , используя один блок (а не вложенные блоки):
try (
OutputStream out1 = ...;
OutputStream out2 = ...;
InputStream in1 = ...;
InputStream in2 = ...;
) {
...
}
Не используйте try
... finally
block : это будет неправильно работать для некоторых крайних случаев (случаев, которые требуют исключенного исключенного ).
Не используйте отключающий крюк: ресурсы редко бывают действительно глобальными, и такой подход будет подвержен гоночным опасностям.try
-with-resources - рекомендуемый способ правильного закрытия всех AutoCloseable
ресурсов: оба были введены в Java одновременно, чтобы они могли работать вместе.
Выполнениеэто неявно помогает реализовать (рекомендуемое) правило, согласно которому только код, отвечающий за создание или открытие чего-либо, отвечает за его удаление или закрытие: если метод передан OutputStream
, он должен никогда close()
,Вместо этого он должен полагаться на то, что вызывающий абонент закрывает его.Если ни один из ваших методов явно не вызывает close()
, ваш код гарантированно никогда не сгенерирует исключение (например, «Socket closed» java.net.SocketException
), потому что он пытается использовать ресурс, который был закрыт.
Это гарантирует, что ресурс будет закрыт ровно один раз.Помните, что в целом небезопасно закрывать AutoCloseable
более одного раза: операция close()
является , а не гарантированно идемпотентной.