В данной заметке хочу рассказать о небольшом изменении, появившемся в Java 9, а именно улучшении, касающемся конструкции try-with-resources. Эти изменения не настолько глобальны, как появление новой модульной системы, но могут быть полезны при написании разных Java-программ.
try-with-resources появился в Java 7, и с помощью этой конструкции мы можем объявить ресурсы, которые будут использоваться в try-блоке, и эти ресурсы будут автоматиески закрыты по окончании выполнения try-блока. Ресурсом будем называть объект, являющийся экземпляром класса, который реализует интерфейс java.lang.AutoCloseable:
try(AutoCloseableImpl acimpl = new AutoClosableImpl(...)) {
acimpl.doSth(...)
//...
}
В приведенном примере после выполнения try-блока на acimpl будет вызван close() метод.
Кроме этого, в рамках одного try-блока может быть создано несколько ресурсов:
try(AutoCloseableImpl acimpl1 = new AutoCloseableImpl(...);
AutoCloseableImpl acimpl2 = new AutoCloseableImpl(acimpl1);
AutoCloseableImpl acimpl3 = new AutoCloseableImpl(acimpl2)) {
//... acimpl1, acimpl2, acimpl3 can be used
}
Закрываться эти ресурсы будут в порядке, обратном их объявлению (под закрытием ресурса подразумевается вызов метода close(), который описан в интерфейсе java.lang.AutoCloseable). Cначала будет закрыт acimpl3, потом acimpl2 и последним acimpl1.
В Java 9 стало возможным использовать в try-блоке ресурсы, объявленные вне try-блока:
AutoCloseableImpl acimpl = new AutoClosableImpl(...);
try (acimpl) {
//acimpl can be used
}
Хочется отметить, что можно использовать ресурс, который создан как final или чье значение не изменяется после создания (effectively final).