Получить доступ

Чем интерфейс AutoCloseable отличается от Closeable?

MiddleИсключения и ресурсы
Коротко

AutoCloseable (Java 7) — для любых ресурсов, close() бросает Exception. Closeable (java.io, старше) — его наследник под ввод-вывод: close() бросает IOException и обязан быть идемпотентным (повторный вызов ничего не делает).

  • AutoCloseable идемпотентность лишь рекомендует
  • Свой ресурс — объявить close() без throws или с узким исключением
  • Lock, соединения, сессии — AutoCloseable

А ещё Обёртка над lock в AutoCloseable позволяет использовать try-with-resources

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

AutoCloseable добавили в Java 7 вместе с try-with-resources, и он намеренно объявляет close() бросающим Exception, чтобы подойти любому ресурсу — соединению с базой, блокировке, сессии. Closeable существовал раньше, живёт в java.io и сужает исключение до IOException. Важное практическое различие в контракте: повторный close() у Closeable обязан быть безвредным, тогда как AutoCloseable этого не требует, хотя реализовывать идемпотентность настоятельно рекомендуется. При проектировании собственного ресурса берут AutoCloseable и по возможности сужают объявленное исключение — это упрощает жизнь вызывающему коду.

Что хотят услышать

  • Различие исключений и идемпотентности.

Частые ошибки

  • Объявлять close() бросающим Exception в своём классе, заставляя всех ловить лишнее.
  • Считать, что try-with-resources работает только с java.io.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Closeable наследует AutoCloseable, объявляет close() с IOException и требует идемпотентности повторного вызова
  • ✗AutoCloseable появился раньше и работает только с потоками ввода-вывода
  • ✗Это синонимы, оставленные для обратной совместимости
  • ✗Только Closeable можно использовать в try-with-resources

Что спросят дальше

  • Почему стоит сужать исключение в своей реализации close()?
  • Что произойдёт, если close() бросит исключение при выходе по return?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем