Какие требования к классам для использования в try-with-resources в Java?

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

Ответ

Классы, используемые в конструкции try-with-resources, должны удовлетворять следующим требованиям:

1. Обязательная реализация интерфейса

  • java.lang.AutoCloseable (Java 7+) или
  • java.io.Closeable (наследует от AutoCloseable)

2. Реализация метода close()

public class CustomResource implements AutoCloseable {
    @Override
    public void close() throws Exception {
        // Освобождение ресурсов
        System.out.println("Resource closed");
    }
}

3. Правила использования

try (FileInputStream fis = new FileInputStream("file.txt");
     BufferedInputStream bis = new BufferedInputStream(fis)) {
    // Работа с ресурсами
} // Автоматический вызов close() в обратном порядке

4. Особенности обработки исключений

  • Исключения из close() добавляются как suppressed к основному исключению
  • Можно получить их через Throwable.getSuppressed()

5. Дополнительные возможности

// Ресурсы могут быть объявлены заранее
CustomResource res = new CustomResource();
try (res) { // Доступно с Java 9
    // ...
}

// Переопределение close() без исключений
@Override
public void close() { // Без throws Exception
    // Безопасное закрытие
}

Практическое правило: Всегда реализуйте AutoCloseable для классов, управляющих внешними ресурсами (файлы, сетевые соединения, БД).