Что такое nullable и non-nullable типы? Какая разница между val и var?android-76

Nullable и Non-Nullable типы

Основная концепция

Kotlin ввел строгую систему типов для решения проблемы NullPointerException (NPE):

  1. Non-Nullable типы (по умолчанию)
    Гарантируют, что переменная никогда не будет null

    val name: String = "Kotlin"  // Ошибка компиляции при name = null```
    
    
  2. Nullable типы?)
    Позволяют переменной содержать null

    val nullableName: String? = null  // Корректно```
    
    

Безопасная работа с Nullable

Kotlin предоставляет несколько способов:

  1. Safe-call оператор (?.)

    val length: Int? = nullableName?.length  // Вернет null если nullableName == null
    
  2. Elvis-оператор (?:)

    val length: Int = nullableName?.length ?: 0  // 0 по умолчанию
    
  3. Not-null assertion (!!)
    (Используйте осторожно, может вызвать NPE)

    val length: Int = nullableName!!.length  // Явное указание, что не null
    
  4. Smart casts
    Компилятор автоматически приводит тип после проверки:

    if (nullableName != null) {
        val length = nullableName.length  // Автоматически String вместо String?
    }
    

Разница между val и var

Ключевые отличия

Характеристика val var
ИзменяемостьНеизменяемая (read-only)Изменяемая
Аналог в Javafinal переменнаяОбычная переменная
Повторное присвоениеЗапрещеноРазрешено

Примеры

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-ошибки.