try (
A a = new A();
B b = new B();
C c = new C()
) {
// ...
}
Помимо того, что это красиво и коротко, это еще и правильно.
Он корректно закроет тот из элементов a, b и c, который необходимо закрыть.
Он корректно закроет тот из элементов a, b и c, который необходимо закрыть.
Он корректно закроет тот из элементов a, b и c, который необходимо закрыть.
Он корректно закроет тот из элементов a, b и c, который необходимо закрыть.
Он корректно закроет тот из элементов a, b и c, который необходимо закрыть.
Он корректно закроет любой из элементов a, b и c, который необходимо закрыть.
li>
Кроме того, он также «подавляет» исключения, возникающие во время закрытия, если исключение выдается из тела (это улучшение по сравнению с try/finally, как можно прочитать здесь https:/ /docs.oracle.com/javase/tutorial/essential/Exceptions/tryResourceClose.html)
2. Guava Closer
Для версий до JDK7 существует Guava Closer, который используется следующим образом:
public class P implements AutoCloseable {
private A a;
private B b;
private C c;
public P() {
a = new A();
b = new B();
c = new C();
}
public close() {
c.close();
b.close();
a.close();
}
}
С этим кодом возникает несколько проблем:
Если из конструктор, ничего не будет закрыто (у вызывающего объекта нет экземпляра для вызова close)
Если из close выдается исключение, некоторые ресурсы будут не закрываться
Ни 1, ни 2 не пострадали от этих проблем. Однако:
try-with-resources явно нельзя использовать, поскольку время жизни P контролируется вызывающей стороной
Guava Closer, похоже, тоже нельзя использовать. Хотя он более гибок, он не поддерживает закрытие и повторное выбрасывание, необходимое для конструктора.
Каков правильный шаблон здесь для N ресурсов без лишнего шаблона? Решение также должно иметь свойство подавления 1 и 2
Для пользовательского кода есть несколько вариантов правильного закрытия нескольких ресурсов:
1. попробовать с ресурсами
[code]try ( A a = new A(); B b = new B(); C c = new C() ) { // ... } [/code]
Помимо того, что это красиво и коротко, это еще и правильно.
[list] [*]Он корректно закроет тот из элементов a, b и c, который необходимо закрыть.
Он корректно закроет тот из элементов a, b и c, который необходимо закрыть.
Он корректно закроет тот из элементов a, b и c, который необходимо закрыть.
Он корректно закроет тот из элементов a, b и c, который необходимо закрыть.
Он корректно закроет тот из элементов a, b и c, который необходимо закрыть.
Он корректно закроет любой из элементов a, b и c, который необходимо закрыть.
li> Кроме того, он также «подавляет» исключения, возникающие во время закрытия, если исключение выдается из тела (это улучшение по сравнению с try/finally, как можно прочитать здесь https:/ /docs.oracle.com/javase/tutorial/essential/Exceptions/tryResourceClose.html) [/list]
2. Guava Closer
Для версий до JDK7 существует Guava Closer, который используется следующим образом:
[code]Closer closer = Closer.create(); try { A a = closer.register(new A()); B b = closer.register(new B()); C c = closer.register(new C()); // ... } catch (Throwable e) { // must catch Throwable throw closer.rethrow(e); } finally { closer.close(); } [/code]
Хотя он немного дольше, он также работает довольно хорошо (дополнительную информацию можно найти здесь https://github.com/google/guava/wiki/ClosingResourcesExplained#closer)
p>
А как насчет объектов, содержащих несколько ресурсов?
Скажем, у меня есть :
[code]public class P implements AutoCloseable { private A a; private B b; private C c;
public P() { a = new A(); b = new B(); c = new C(); }
public close() { c.close(); b.close(); a.close(); } } [/code]
С этим кодом возникает несколько проблем:
[list] [*]Если из конструктор, ничего не будет закрыто (у вызывающего объекта нет экземпляра для вызова close) [*]Если из close выдается исключение, некоторые ресурсы будут не закрываться [/list]
Ни [b]1[/b], ни [b]2[/b] не пострадали от этих проблем. Однако:
[list] [*]try-with-resources явно нельзя использовать, поскольку время жизни P контролируется вызывающей стороной [*]Guava Closer, похоже, тоже нельзя использовать. Хотя он более гибок, он не поддерживает закрытие и повторное выбрасывание, необходимое для конструктора. [/list]
Каков правильный шаблон здесь для N ресурсов без лишнего шаблона? Решение также должно иметь свойство подавления [b]1[/b] и [b]2[/b]