Lombok @Cleanup — автоматическое управление ресурами

Цикл статей «Project Lombok».

Следующая статья — «Lombok @Getter и @Setter — больше не нужно писать геттеры и сеттеры».
Предыдущая статья — «Lombok @NonNull, или как я перестал беспокоиться и полюбил NullPointerException».

Вы можете использовать @Cleanup, для того чтобы гарантировать, что данный выделенный ресурс автоматически очистит за собой, до того как он выйдет за пределы области видимости. Вы делаете это указывая аннотацию  @Cleanup для любой локальной переменной вот так:
@Cleanup InputStream in = new FileInputStream("some/file"); . В результате в конце области видимости будет вызываться in.close(). Этот вызов гарантирует использование конструкции try/finally. Смотрите пример ниже, чтобы увидеть, как это работает.

Если тип, ресурсы которого вы хотите очистить, не имеет метода close(), но имеет другой метод без аргументов, то вы можете указать имя метода:
@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);
По умолчанию используется метод close(). Методы очистки с аргументами не могут быть вызваны с помощью @Cleanup.

С использованием lombok

Чистая Java

Поддерживаемые ключи конфигурации

Lombok будет помечать любое использование @Cleanup как предупреждение или ошибку, если настроено.

Мелким шрифтом

Метод очистки в блоке finally будет вызываться только в том случае, если данный ресурс не равен null. Однако если вы используете delombok в коде, то вызов lombok.Lombok.preventNullAnalysis(Object o) вставляется, чтобы предотвратить получение предупреждений, если статический анализ кода может определить, что проверка на null не нужна.  Компиляция с lombok.jar в classpath удаляет вызов этого метода, так что здесь нет зависимости во время исполнения.

Если ваш код генерирует исключение, и метод очистки тоже генерирует исключение, то изначальное исключение скрывается исключением, которое сгенерировал код очистки. Вы не должны полагаться на эту «фичу». Более предпочтительно, чтобы lombok генерировал код так, что если главный код вызвал исключение, любое исключение, возникшее в коде очистки тихо подавилось (но если главный код завершился любым другим способом, то исключения кода очистки не должны подавляться). Авторы lombok сейчас не знают подходящего способа реализовать эту схему, но если обновления Java позволят это, или они найдут способ, то они это исправят.

 

Цикл статей «Project Lombok».

Следующая статья — «Lombok @Getter и @Setter — больше не нужно писать геттеры и сеттеры».
Предыдущая статья — «Lombok @NonNull, или как я перестал беспокоиться и полюбил NullPointerException».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *