Какой интерфейс должен реализовать ресурс для автоматического закрытия в Java?

«Какой интерфейс должен реализовать ресурс для автоматического закрытия в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ресурс должен реализовывать интерфейс AutoCloseable (с Java 7+). Его наследник Closeable (из пакета java.io) также подходит, но имеет более узкую спецификацию.

Ключевые отличия:

  • AutoCloseable.close() может бросать любое исключение типа Exception.
  • Closeable.close() объявлен для выбрасывания только IOException.

Пример использования в try-with-resources:

try (FileInputStream fis = new FileInputStream("file.txt");
     BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
    // Работа с ресурсами
} // fis.close() и br.close() вызовутся автоматически здесь

Важные детали:

  1. Ресурсы в try-with-resources закрываются в обратном порядке их объявления.
  2. Исключения, выброшенные в блоке try, имеют приоритет. Исключения из методов close() подавляются, но добавляются в массив подавленных исключений основного исключения (доступны через getSuppressed()).