Зачем используют ключевые слова final, finally и finalize?android-40

1. final - ключевое слово для неизменяемости

В Java:

// final переменная - константа
final int MAX_COUNT = 100;

// final метод - нельзя переопределить
public final void criticalMethod() {}

// final класс - нельзя наследовать
public final class SecureClass {}

В Kotlin:

Аналогами являются:

  • val вместо final переменных
  • Ключевое слово final в классах/методах (по умолчанию все классы и методы в Kotlin final)
// Эквивалент final в Kotlin
val pi = 3.14 // final переменная
open class Parent {
    open fun overridable() {}
    fun nonOverridable() {} // final по умолчанию
}

Зачем нужно:

  • Защита от изменений (константы)
  • Запрет переопределения критически важных методов
  • Предотвращение наследования (например, для security или immutable классов)

2. finally - блок для гарантированного выполнения кода

Используется в try-catch блоках:

try {
    // Код, который может выбросить исключение
    openFile();
} catch (IOException e) {
    // Обработка ошибки
    logError(e);
} finally {
    // Выполнится ВСЕГДА
    closeResources();
}

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

  • Выполняется даже при return в try/catch
  • Не выполняется только при System.exit() или фатальной ошибке
  • В Kotlin можно использовать с use для автозакрытия ресурсов
File("data.txt").bufferedReader().use { reader ->
    // Автоматически закроется после блока
    println(reader.readText())
}

3. finalize - метод сборщика мусора

Что это было: Метод, который вызывался перед удалением объекта сборщиком мусора.

@Override
protected void finalize() throws Throwable {
    try {
        releaseResources();
    } finally {
        super.finalize();
    }
}

Проблемы:

  1. Не гарантируется время вызова (может никогда не вызваться)
  2. Снижает производительность GC
  3. Может быть вызван несколько раз для одного объекта

Современные альтернативы:

  • Для управления ресурсами: AutoCloseable + try-with-resources (Java) или use (Kotlin)
  • Для очистки: PhantomReference + ReferenceQueue

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

Ключевое слово Область применения Когда выполняется Современная альтернатива
finalКлассы/методы/переменныеВо время компиляцииВ Kotlin: val, default final
finallyОбработка исключенийПосле try/catchuse в Kotlin
finalize()Сборка мусораНеопределенно (до удаления объекта)AutoCloseable, Cleaner

Резюмируем:

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

В современной Android-разработке следует активно использовать final/val для иммутабельности и finally/use для работы с ресурсами, а от finalize() рекомендуется отказаться в пользу более предсказуемых альтернатив.