← Назад к вопросам

Приведи пример extension

1.3 Junior🔥 161 комментариев
#Kotlin основы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример extension в Kotlin

Extension-функции (расширения) в Kotlin — это мощный механизм, который позволяет добавлять новую функциональность к существующим классам без необходимости наследования или использования шаблона декоратора. По сути, вы «расширяете» класс новыми методами, которые могут вызываться так, как если бы они были частью оригинального класса.

Простой пример расширения для String

Допустим, мы часто работаем с проверкой, является ли строка валидным email-адресом. Вместо того чтобы создавать утилитарные функции, мы можем добавить extension-функцию к классу String:

fun String.isValidEmail(): Boolean {
    val emailRegex = "^[A-Za-z](.*)([@]{1})(.{1,})(\\.)(.{1,})".toRegex()
    return this.matches(emailRegex)
}

// Использование
fun main() {
    val email = "user@example.com"
    println("Email valid: ${email.isValidEmail()}") // Вывод: Email valid: true
    
    val invalidEmail = "invalid.email"
    println("Email valid: ${invalidEmail.isValidEmail()}") // Вывод: Email valid: false
}

Extension-свойство для работы с датами

Extensions могут быть не только функциями, но и свойствами (только val, поскольку backing field не поддерживается):

import java.time.LocalDate
import java.time.Period

val LocalDate.age: Int
    get() = Period.between(this, LocalDate.now()).years

// Использование
fun main() {
    val birthDate = LocalDate.of(1990, 5, 15)
    println("Возраст: ${birthDate.age} лет") // Выведет текущий возраст
}

Расширение для коллекций с практическим применением

Один из наиболее полезных сценариев — расширение стандартных коллекций для domain-специфичных операций:

fun List<Int>.averageOrZero(): Double {
    return if (this.isEmpty()) 0.0 else this.average()
}

fun <T> List<T>.secondOrNull(): T? {
    return this.getOrNull(1)
}

// Использование
fun main() {
    val numbers = listOf(1, 2, 3, 4, 5)
    println("Average: ${numbers.averageOrZero()}") // Вывод: Average: 3.0
    println("Second element: ${numbers.secondOrNull()}") // Вывод: Second element: 2
    
    val emptyList = emptyList<Int>()
    println("Average of empty: ${emptyList.averageOrZero()}") // Вывод: Average of empty: 0.0
}

Extension для View в Android

В Android development extensions особенно полезны для работы с View:

import android.view.View
import android.widget.Toast

fun View.showToast(message: String, duration: Int = Toast.LENGTH_SHORT) {
    Toast.makeText(this.context, message, duration).show()
}

fun View.setVisible(visible: Boolean) {
    this.visibility = if (visible) View.VISIBLE else View.GONE
}

// Использование в Activity/Fragment
// button.showToast("Hello from extension!")
// progressBar.setVisible(true)

Важные особенности extensions:

  • Статическое разрешение — extensions разрешаются статически во время компиляции, а не динамически во время выполнения. Это означает, что они не виртуальные и выбираются на основе объявленного типа, а не фактического типа объекта.
  • Не модифицируют оригинальный класс — extension не вставляет новые члены в класс, а лишь позволяет вызывать новые функции через точечную нотацию.
  • Приоритет — если extension-функция имеет ту же сигнатуру, что и функция-член класса, функция-член всегда будет иметь приоритет.
  • Область видимости — extensions должны быть импортированы для использования, что помогает избежать конфликтов имен.
  • Nullable-приемники — можно создавать extensions для nullable-типов, что полезно для обработки null-значений:
fun String?.safeLength(): Int {
    return this?.length ?: 0
}

fun main() {
    val str: String? = null
    println("Length: ${str.safeLength()}") // Вывод: Length: 0
}

Практические преимущества использования extensions:

  • Улучшение читаемости кода — код становится более выразительным и близким к предметной области
  • Избегание утилитарных классов — вместо StringUtils.isValidEmail(email) можно использовать email.isValidEmail()
  • Организация кода — extensions можно группировать по тематическим файлам
  • Безопасность — типобезопасность сохраняется, все проверки выполняются на этапе компиляции

Extensions — один из краеугольных камней Kotlin, который активно используется в стандартной библиотеке (например, let, apply, also, run, with) и позволяет писать более идиоматичный, чистый и поддерживаемый код.

Приведи пример extension | PrepBro