null

Java 9 и try-with-resources

В данной заметке хочу рассказать о небольшом изменении, появившемся в 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).