5.09. Ключевые слова в Kotlin
Ключевые слова в Kotlin
Kotlin использует набор зарезервированных слов для построения синтаксических конструкций языка. Все ключевые слова разделены на категории по назначению.
Управляющие конструкции
| Ключевое слово | Значение | Пример |
|---|---|---|
if | Условное ветвление с возвратом значения | val max = if (a > b) a else b |
when | Многостороннее ветвление, замена switch | when (x) { 1 -> println("Один"); else -> println("Другое") } |
for | Итерация по диапазону или коллекции | for (i in 1..5) println(i) |
while | Цикл с предусловием | while (x < 10) x++ |
do | Цикл с постусловием (в паре с while) | do { read() } while (!eof) |
break | Прерывание цикла | for (i in list) { if (i == target) break } |
continue | Переход к следующей итерации цикла | for (i in 1..10) { if (i % 2 == 0) continue; println(i) } |
return | Возврат значения из функции или лямбды | fun sum(a: Int, b: Int): Int = return a + b |
Объявление сущностей
| Ключевое слово | Значение | Пример |
|---|---|---|
class | Объявление класса | class User(val name: String) |
interface | Объявление интерфейса | interface Drawable { fun draw() } |
object | Объявление объекта-одиночки или анонимного класса | object Logger { fun log(msg: String) = println(msg) } |
fun | Объявление функции | fun greet(name: String) = "Привет, $name" |
val | Объявление неизменяемой переменной или свойства | val pi = 3.14 |
var | Объявление изменяемой переменной или свойства | var counter = 0 |
typealias | Создание псевдонима для типа | typealias JsonMap = Map<String, Any> |
package | Указание принадлежности к пакету | package com.example.app |
import | Импорт классов или функций из других пакетов | import java.util.Date |
Проверка типов и приведение
| Ключевое слово | Значение | Пример |
|---|---|---|
is | Проверка принадлежности объекта к типу | if (obj is String) println(obj.length) |
!is | Отрицательная проверка типа | if (obj !is Number) return |
as | Безопасное приведение типа с исключением при неудаче | val str = obj as String |
as? | Безопасное приведение типа с возвратом null при неудаче | val str = obj as? String |
Обработка исключений
| Ключевое слово | Значение | Пример |
|---|---|---|
try | Начало блока обработки исключений | try { riskyOperation() } catch (e: Exception) { handle(e) } |
catch | Перехват исключения определённого типа | try { compute() } catch (e: IOException) { log(e) } |
finally | Блок, выполняемый в любом случае после try | try { open() } finally { close() } |
throw | Генерация исключения | throw IllegalArgumentException("Неверный аргумент") |
Контекстные ссылки
| Ключевое слово | Значение | Пример |
|---|---|---|
this | Ссылка на текущий объект или замыкание | class Box { fun copy() = this } |
super | Доступ к членам родительского класса | open class Base { open fun f() {} } class Child : Base() { override fun f() { super.f() } } |
it | Неявный параметр лямбда-выражения с одним аргументом | list.filter { it > 0 }.map { it * 2 } |
Литералы и специальные значения
| Ключевое слово | Значение | Пример |
|---|---|---|
null | Отсутствие значения | var name: String? = null |
true | Логическая истина | val isValid = true |
false | Логическая ложь | val isEmpty = false |
Модификаторы видимости
| Ключевое слово | Значение | Пример |
|---|---|---|
public | Доступ из любого места (значение по умолчанию) | public fun apiMethod() {} |
private | Доступ только внутри текущего класса или файла | class Box { private var hidden = 0 } |
protected | Доступ внутри класса и его подклассов | open class Base { protected fun helper() {} } |
internal | Доступ внутри модуля | internal fun moduleHelper() {} |
Модификаторы наследования и переопределения
| Ключевое слово | Значение | Пример |
|---|---|---|
open | Разрешение наследования класса или переопределения члена | open class Parent { open fun f() {} } |
override | Явное переопределение члена родительского класса | class Child : Parent() { override fun f() {} } |
final | Запрет переопределения (значение по умолчанию для классов) | final class Utility { } |
abstract | Объявление абстрактного класса или метода | abstract class Figure { abstract fun area(): Double } |
Специальные модификаторы классов
| Ключевое слово | Значение | Пример |
|---|---|---|
sealed | Ограничение иерархии наследования одним файлом | sealed class Result { class Success : Result(); class Error : Result() } |
data | Автоматическая генерация методов equals, hashCode, toString | data class User(val id: Int, val name: String) |
enum | Объявление перечисления | enum class Color { RED, GREEN, BLUE } |
annotation | Объявление аннотации | annotation class JsonField(val name: String) |
companion | Объявление companion-объекта внутри класса | class StringUtils { companion object { fun empty() = "" } } |
const | Объявление константы времени компиляции | const val MAX_COUNT = 100 |
Модификаторы функций
| Ключевое слово | Значение | Пример |
|---|---|---|
inline | Встраивание тела функции при вызове для оптимизации | inline fun <T> lock(lock: Lock, body: () -> T): T |
infix | Разрешение вызова функции через инфиксную нотацию | infix fun Int.times(str: String) = str.repeat(this) |
operator | Перегрузка операторов языка | operator fun Point.plus(other: Point) = Point(x + other.x, y + other.y) |
suspend | Объявление корутинной функции | suspend fun fetchData(): String |
tailrec | Оптимизация хвостовой рекурсии | tailrec fun gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b) |
noinline | Запрет встраивания лямбда-параметра в inline-функции | inline fun foo(f: () -> Unit, noinline g: () -> Unit) |
crossinline | Запрет нелокального возврата из лямбды в inline-функции | inline fun run(block: () -> Unit) { block() } |
Модификаторы параметров и свойств
| Ключевое слово | Значение | Пример |
|---|---|---|
vararg | Разрешение передачи переменного числа аргументов | fun printAll(vararg messages: String) { for (m in messages) println(m) } |
reified | Доступ к реальному типу параметра в inline-функциях | inline fun <reified T> Gson.fromJson(json: String) = fromJson(json, T::class.java) |
lateinit | Отложенная инициализация свойства без использования nullable-типа | lateinit var viewModel: ViewModel |
out | Ковариантность типа в обобщённых классах | interface Producer<out T> { fun produce(): T } |
in | Контравариантность типа в обобщённых классах | interface Consumer<in T> { fun consume(value: T) } |
Прочие ключевые слова
| Ключевое слово | Значение | Пример |
|---|---|---|
by | Делегирование реализации интерфейса или свойства | class Delegate { operator fun getValue(...) } val prop by Delegate() |
where | Указание множественных ограничений для обобщённых типов | fun <T> copyWhenGreater(list: List<T>, threshold: T) where T : Comparable<T>, T : Cloneable |
constructor | Явное объявление конструктора класса | class Person(val name: String) { constructor(name: String, age: Int) : this(name) } |
init | Блок инициализации класса | class User { init { println("Создан экземпляр") } } |
get | Объявление пользовательского геттера свойства | val isEmpty get() = size == 0 |
set | Объявление пользовательского сеттера свойства | var counter = 0 set(value) { if (value >= 0) field = value } |
field | Доступ к внутреннему полю свойства внутри геттера или сеттера | var name = "" set(value) { field = value.trim() } |
actual | Реализация ожидаемого объявления в мультиплатформенных проектах | actual class Platform { actual fun name() = "JVM" } |
expect | Объявление ожидаемого класса или функции для мультиплатформы | expect class Platform { fun name(): String } |
external | Объявление функции, реализованной вне Kotlin (JNI, JS) | external fun jsFunction(): dynamic |