Ключевое слово final
Ключевое слово final применяется к классам, методам и свойствам
для запрета наследования и переопределения. Класс, помеченный как final,
не может быть унаследован. Метод или свойство, помеченные как final,
не могут быть переопределены в классах-потомках.
Синтаксис
final class ClassName {
fun methodName() {}
final val propertyName: Type
}
open class ParentClass {
final fun cannotOverride() {}
open fun canOverride() {}
}
Пример
Создадим final класс, который нельзя наследовать:
final class DateFormatter {
fun formatDate(): String = "2023-12-31"
}
// Этот код вызовет ошибку компиляции:
// class CustomFormatter : DateFormatter() {}
Пример
Создадим класс с final методом, который нельзя переопределить:
open 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 со свойствами:
open 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"
}
Пример
Практический пример с обработкой дат:
open 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)
Результат выполнения кода:
Boolean true
Примечания
В Kotlin по умолчанию все классы являются final, поэтому
ключевое слово final для классов часто не используется явно.
Для разрешения наследования необходимо использовать ключевое слово open.
Для методов и свойств поведение обратное: по умолчанию они не могут быть
переопределены, и только с ключевым словом open разрешается переопределение.