JavaRush /Java блог /Архив info.javarush /Java 7 try-with-resources
DarthVictor
28 рівень

Java 7 try-with-resources

Стаття з групи Архив info.javarush
Починаючи з сьомої версії Java пропонує поліпшене управління ресурсами, які мають бути закриті після завершення роботи з ними. До таких ресурсів належать, наприклад, файли, потоки, з'єднання з базами даних і сокетами. Цій меті слугує спеціальна мовна конструкція try-with-resources. Для того, щоб це автоматичне закриття працювало, створено спеціальний інтерфейс AutoCloseable. Java 7 try-with-resources - 1В Java 7 всі класи ресурсів реалізують цей інтерфейс. Його сигнатура має такий вигляд:

public interface AutoCloseable {
    void close() throws Exception;
}
Інтерфейс оголошує метод close(), який автоматично викликається для об'єктів, що обслуговуються конструкцією try-with-resources. Незважаючи на те, що класи ресурсів у Java 7 реалізують цей інтерфейс, безліч бібліотек, якими ви користуєтеся, цього не роблять, оскільки бібліотеку ще не оновили для роботи з інтерфейсом AutoCloseable або ж ви просто не маєте можливості оновити бібліотеку. У більшості випадків це вирішується просто. Успадкуйте клас ресурсу, який має брати участь у конструкції try-with-resources. Візьмемо як приклад ITextRenderer (з проєкту Flying Saucer). Після завершення роботи з ITextRenderer, має бути викликаний метод finishPDF(). Зазвичай ви б робили це в блоці finally. Але створюючи новий клас, що розширює ITextRenderer і реалізує інтерфейс AutoCloseable, ви можете додати його в конструкцію try-with-resources. Новий клас AutoCloseableITextRenderer матиме за таких умов такий вигляд:

public class AutoCloseableITextRenderer extends ITextRenderer implements AutoCloseable {
    @Override
    public void close() {
        super.finishPDF();
    }
}
Розширення оригінального класу в нащадку є найбільш розумним рішенням, оскільки новий клас, як і раніше, буде ITextRenderer. У разі, якщо вихідний клас оголошено як final, необхідно використовувати композицію. І ось який матиме вигляд використання за таких умов:

try (final AutoCloseableITextRenderer iTextRenderer = new AutoCloseableITextRenderer()) {
            ByteArrayOutputStream out; // містить дані, які необхідно конвертувати в PDF, тут не показано.
            iTextRenderer.setDocumentFromString(new String(out.toByteArray()));
            iTextRenderer.layout();
            iTextRenderer.createPDF(pdfOutputStream);
            pdfOutputStream.flush();
        }
Ось і все. Будь ласка, зверніть увагу, що я не викидав виняток із методу close() у класі AutoCloseableITextRenderer. У Javadoc інтерфейсу AutoCloseable щодо цього сказано таке: Хоча в метод інтерфейсу декларовано викидати винятки Exception, тим, хто реалізує цей метод, наполегливо рекомендується використовувати під час реалізації методу більш специфічні класи винятків, або взагалі не викидати винятків, якщо метод close() не може впасти.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ