Назад к вопросам
Middle
135
questionbank

Какие общие идиомы и паттерны вы используете в Kotlin?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

  • Создание data классов.
  • Использование расширяющих функций для добавления функциональности без изменения исходного класса.
  • Применение null-safety операторов (?, ?:, !!) для безопасной работы с nullable типами.
  • Лямбды и функции высшего порядка для работы с коллекциями и асинхронными операциями.
  • Использование when вместо switch-case.
  • Применение object для синглтонов.
  • Использование корутин для асинхронного и неблокирующего кода.
  • Применение scope functions (let, run, with, apply, also) для выполнения блока кода в контексте объекта.
  • Delegate свойства для сокращения шаблонного кода (например, lazy, by viewModels()).

Примеры:

// Data класс
data class User(val name: String, val age: Int)

// Расширяющая функция
fun String.addGreeting(greeting: String): String {
    return "$greeting, $this"
}

// Null-safety операторы
val nullableString: String? = null
val length = nullableString?.length ?: 0 // Elvis оператор

// Лямбда и функции высшего порядка
val numbers = listOf(1, 2, 3, 4, 5)
val squared = numbers.map { it * it }

// when выражение
fun describe(obj: Any): String =
    when (obj) {
        1          -> "One"
        "Hello"    -> "Greeting"
        is Long    -> "Long"
        !is String -> "Not a string"
        else       -> "Unknown"
    }

// object синглтон
object SingletonExample {
    fun doSomething() {
        // ...
    }
}

// Корутины
import kotlinx.coroutines.*

fun main() = runBlocking { // main co-routine
    launch { // launch a new co-routine and continue
        delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
        println("World!") // print after delay
    }
    println("Hello,") // main co-routine continues while a previous has delayed
}

// Scope functions
val person = User("Alice", 30)
person.apply { // apply returns the object itself
    age += 1
}.also { // also returns the object itself
    println("Person's new age is ${it.age}")
}

// Delegate свойство с lazy
val lazyValue: String by lazy {
    println("computed!")
    "Hello"
}