Разница между final, finally и finalize?qa-45

1. final

Назначение: Модификатор, применяемый к классам, методам и переменным

Особенности:

  • final переменная: нельзя изменить значение после инициализации

    final int MAX_VALUE = 100;
    // MAX_VALUE = 200; // Ошибка компиляции
    
  • final метод: нельзя переопределить в подклассах

    class Parent {
        final void show() { System.out.println("Parent"); }
    }
    class Child extends Parent {
        // void show() { } // Ошибка компиляции
    }
    
  • final класс: нельзя наследовать

    final class MyFinalClass { }
    // class SubClass extends MyFinalClass { } // Ошибка
    

2. finally

Назначение: Блок в конструкции try-catch-finally для гарантированного выполнения кода

Особенности:

  • Выполняется всегда, даже если было исключение или return
  • Используется для освобождения ресурсов
try {
    // Код, который может вызвать исключение
} catch (Exception e) {
    // Обработка исключения
} finally {
    // Этот код выполнится в любом случае
    System.out.println("Cleanup resources");
}

Важно: finally не сработает только если:

  • Вызван System.exit()
  • "Упал" весь JVM процесс
  • Поток был прерван

3. finalize

Назначение: Метод класса Object, вызываемый сборщиком мусора перед удалением объекта

Особенности:

  • Позволяет объекту выполнить cleanup перед уничтожением
  • Не гарантируется когда будет вызван (или будет ли вызван вообще)
class MyClass {
    @Override
    protected void finalize() throws Throwable {
        try {
            // Освобождение ресурсов
        } finally {
            super.finalize();
        }
    }
}

Проблемы:

  • Не надежен (может не быть вызван)
  • Может повлиять на производительность
  • Deprecated начиная с Java 9 (лучше использовать AutoCloseable)

Сравнительная таблица

Критерий final finally finalize()
Тип Ключевое слово Блок кода Метод
Когда работает Компиляция Выполнение Сборка мусора
Надежность Гарантировано Гарантировано* Не гарантировано
Использование Часто Часто Избегать

  • кроме особых случаев (System.exit и т.д.)

Резюмируем

  • final - про неизменяемость и запрет модификации (переменные, методы, классы)
  • finally - про гарантированное выполнение кода (очистка ресурсов)
  • finalize() - устаревший механизм очистки (не рекомендуется к использованию)

Совет: Для работы с ресурсами вместо finalize() используйте:

  • try-with-resources (Java 7+)
  • Реализацию AutoCloseable
  • Явный вызов close() в finally блоке