1. попробовать с ресурсами
Код: Выделить всё
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)
Для версий до JDK7 существует Guava Closer, который используется следующим образом:
Код: Выделить всё
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();
}
p>
А как насчет объектов, содержащих несколько ресурсов?
Скажем, у меня есть :
Код: Выделить всё
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 выдается исключение, некоторые ресурсы будут не закрываться
- try-with-resources явно нельзя использовать, поскольку время жизни P контролируется вызывающей стороной
- Guava Closer, похоже, тоже нельзя использовать. Хотя он более гибок, он не поддерживает закрытие и повторное выбрасывание, необходимое для конструктора.
Подробнее здесь: https://stackoverflow.com/questions/492 ... -resources