Ключевое слово final

Ключевое слово final применяется к классам, методам и свойствам для запрета наследования и переопределения. Класс, помеченный как final, не может быть унаследован. Метод или свойство, помеченные как final, не могут быть переопределены в классах-потомках.

Синтаксис

kotlinfinal class ClassName {
  fun methodName() {}
  final val propertyName: Type
}
kotlinopen class ParentClass {
  final fun cannotOverride() {}
  open fun canOverride() {}
}

Пример

Создадим final класс, который нельзя наследовать:

kotlinfinal class DateFormatter {
  fun formatDate(): String = "2023-12-31"
}

// Этот код вызовет ошибку компиляции:
// class CustomFormatter : DateFormatter() {}

Пример

Создадим класс с final методом, который нельзя переопределить:

kotlinopen class TimeProcessor {
  final fun getCurrentTime(): String = "12:00:00"
  
  open fun processTime(): String = "Processing time"
}

class AdvancedTimeProcessor : TimeProcessor() {
  // Этот код вызовет ошибку компиляции:
  // override fun getCurrentTime(): String = "12:05:00"
  
  override fun processTime(): String = "Advanced processing"
}

Пример

Использование final со свойствами:

kotlinopen class DateTimeConfig {
  final val defaultFormat: String = "YYYY-MM-DD HH:MM:SS"
  open val timeZone: String = "UTC"
}

class CustomDateTimeConfig : DateTimeConfig() {
  // Этот код вызовет ошибку компиляции:
  // override val defaultFormat: String = "DD.MM.YYYY"
  
  override val timeZone: String = "GMT+3"
}

Пример

Практический пример с обработкой дат:

kotlinopen class DateValidator {
  final val minYear: Int = 1900
  final val maxYear: Int = 2100
  
  final fun isValidYear(year: Int): Boolean {
    return year in minYear..maxYear
  }
  
  open fun validateDate(day: Int, month: Int, year: Int): Boolean {
    return isValidYear(year) && month in 1..12 && day in 1..31
  }
}

class StrictDateValidator : DateValidator() {
  override fun validateDate(day: Int, month: Int, year: Int): Boolean {
    if (!super.validateDate(day, month, year)) return false
    
    // Дополнительная строгая валидация
    return month != 2 || day <= 29
  }
}

val validator = StrictDateValidator()
val res = validator.validateDate(29, 2, 2024)
println(res)

Результат выполнения кода:

kotlinBoolean true

Примечания

В Kotlin по умолчанию все классы являются final, поэтому ключевое слово final для классов часто не используется явно. Для разрешения наследования необходимо использовать ключевое слово open.

Для методов и свойств поведение обратное: по умолчанию они не могут быть переопределены, и только с ключевым словом open разрешается переопределение.

Смотрите также

  • ключевое слово open,
    которое разрешает наследование и переопределение
  • ключевое слово override,
    которое используется для переопределения методов и свойств
  • модификатор abstract,
    который объявляет абстрактные классы и члены
  • модификатор interface,
    который используется для объявления интерфейсов