Kotlin ввел строгую систему типов для решения проблемы NullPointerException
(NPE):
Non-Nullable типы (по умолчанию)
Гарантируют, что переменная никогда не будет null
val name: String = "Kotlin" // Ошибка компиляции при name = null```
Nullable типы (с ?
)
Позволяют переменной содержать null
val nullableName: String? = null // Корректно```
Kotlin предоставляет несколько способов:
Safe-call оператор (?.
)
val length: Int? = nullableName?.length // Вернет null если nullableName == null
Elvis-оператор (?:
)
val length: Int = nullableName?.length ?: 0 // 0 по умолчанию
Not-null assertion (!!
)
(Используйте осторожно, может вызвать NPE)
val length: Int = nullableName!!.length // Явное указание, что не null
Smart casts
Компилятор автоматически приводит тип после проверки:
if (nullableName != null) {
val length = nullableName.length // Автоматически String вместо String?
}
Характеристика | val | var |
---|---|---|
Изменяемость | Неизменяемая (read-only) | Изменяемая |
Аналог в Java | final переменная | Обычная переменная |
Повторное присвоение | Запрещено | Разрешено |
val pi: Double = 3.14
pi = 3.1415 // Ошибка компиляции: Val cannot be reassigned```
```Пример var:
var counter: Int = 0
counter = 1 // Корректно```
### Важные нюансы
1. **val ≠ иммутабельность**
Для объектов содержимое может изменяться:
val list = mutableListOf(1, 2, 3)
list.add(4) // Корректно
2. **Рекомендации**:
- По умолчанию используйте `val`
- `var` только когда действительно нужно изменять значение
- Для immutable коллекций используйте `listOf()`, `setOf()` и т.д.
## Резюмируем
1. **Nullable/Non-Nullable**:
- Non-null по умолчанию защищает от NPE
- `?` явно указывает на возможный null
- Используйте safe-calls и elvis для безопасной работы
2. **val vs var**:
- `val` — для неизменяемых ссылок (рекомендуется по умолчанию)
- `var` — когда нужно изменять значение
- Помните, что `val` не делает объект иммутабельным
Эти особенности Kotlin помогают писать более безопасный и выразительный код, минимизируя runtime-ошибки.