Kotlin в IntelliJ IDEA Kotlin змінні Kotlin типи даних Kotlin операції з числами Kotlin умовні вирази Kotlin умовні конструкції Kotlin цикли Kotlin послідовності Kotlin масиви Kotlin функціональне програмування Kotlin змінна кількість параметрів. Vararg Kotlin повернення результату. оператор return Kotlin однорядкові і локальні функції Kotlin перевантаження функцій Kotlin Лямбда-вирази Kotlin функції вищого порядку Kotlin Анонімні функції Kotlin ООП Класи і об'єкти Kotlin ООП властивості Kotlin ООП конструктор Kotlin ООП функції в класах Kotlin ООП Пакети та імпорт Kotlin ООП модифікатори видимості Kotlin ООП вкладені класи Kotlin ООП інтерфейси Kotlin ООП спадкування Kotlin ООП Перевизначення методів і властивостей Kotlin ООП Абстрактні класи та методи Kotlin ООП Data-класи Kotlin ООП перерахування enums Kotlin ООП Null і nullable-типи Kotlin ООП Обробка винятків Kotlin ООП перетворення типів Kotlin ООП Інфіксна функція Kotlin ООП функції розширення Kotlin ООП Узагальнені класи і функції Kotlin ООП обмеження узагальнень Kotlin ООП Варіантність, коваріантність і контраваріантність Kotlin Колекції. Змінювані і незмінні колекції Kotlin Колекції. LIST список Kotlin Колекції. Set Kotlin Колекції. Map

Kotlin ООП Null і nullable-типи


Додаткові можливості


Null і nullable-типи

Ключове слово null представляє спеціальний літерал, який вказує, що змінна не має як такого значення. Тобто у неї по суті не вказане значення.

val n = null
println(n)  // null

Подібне значення може бути корисно в ряді ситуаціях, коли необхідно використовувати дані, але при цьому точно невідомо, а чи є в реальності ці дані. Наприклад, ми отримуємо дані по мережі, дані можуть прийти або не прийти. Або може бути ситуація, коли нам треба явним чином вказати, що дані не встановлені.

Однак змінним стандартних типів, наприклад, типу Int або String або будь-яких інших класів, ми не можемо просто взяти і привласнити значення null:

val n : Int = null   // ! Ошибка, переменная типа Int допускает только числа

Ми можемо привласнити значення null тільки змінної, яка представляє тип Nullable. Щоб перетворити звичайний тип в тип nullable, досить поставити після назви типу знак питання:

// val n : Int = null  //! ошибка, Int не допускает значение null
val d : Int? = null // норм, Int? допускает значение null

При цьому ми можемо передавати змінним nullable-типів як значення null, так і конкретні значення, які укладаються в діапазон значень даного типу:

var age : Int? = null
age = 34              // Int? допускает null и числа
var name : String? = null
name = "Tom"        // String? допускает null и строки

У той же час треба розуміти, що String? і Int? - це не те ж саме, що і String і Int. Nullable типи мають ряд обмежень:

  • Значення nullable-типів можна присвоїти безпосередньо змінним, які не допускають значення null
  • У об'єктів nullable-типів можна викликати безпосередньо ті ж методи, які є у звичайних типів
  • Не можна передавати значення nullable-типів в якості аргументу в функцію, де потрібно конкретне значення, яке не може представляти null

Оператор?:

Одним з переваг Kotlin полягає в тому, що його система типів дозволяє визначати проблеми, пов'язані з використанням null, під час компіляції, а не під час виконання. Наприклад, візьмемо наступний код:

var name : String?  = "Tom"
val firstName: String = name    // ! Ошибка

Мінлива name зберігає рядок "Tom". Мінлива firstName представляє тип String і теж може зберігати рядки, але тим не менш безпосередньо в даному випадку ми не можемо передати значення з змінної name в firstName. В даному випадку для компілятора невідомо, яким значенням инициализирована змінна name. Адже змінна name може містити і значення null, яке неприпустимо для типу String.

У цьому випадку ми можемо використовувати оператор ?: , Який дозволяє надати альтернативне значення, якщо привласнюється значення дорівнює null:

var name : String?  = "Tom"
val firstName: String = name ?: "Undefined" // если name = null, то присваивается "Undefined"
 
var age: Int? = 23
val myAge: Int = age ?:0    // если age равно null, то присваивается число 0

Оператор ?: Приймає два операнда. Якщо перший операнд НЕ дорівнює null, то повертається значення першого операнда. Якщо перший операнд дорівнює null, то повертається значення другого операнда.

Тобто це все одно, якби ми написали:

var name : String?  = "Tom"
val firstName: String
if(name!=null){
 
    firstName = name
}

Але оператор ?: Дозволяє скоротити подібну конструкцію.


Оператор ?.

Оператор ?. дозволяє об'єднати перевірку значення об'єкта на null і виконання функції цього об'єкта.

Наприклад, у рядків є властивість length, яке повертає довжину рядка в символах. У об'єкта String? ми просто так не можемо звернутися до властивості length, так як якщо об'єкт String? дорівнює null, то і рядки як такої немає, і відповідно довжину рядка можна визначити. І в цьому випадку ми можемо застосувати оператор ?.:

val name : String?  = "Tom"
val length: Int? = name?.length

Якщо змінна name раптом дорівнює null, то змінна length отримає значення null. Якщо змінна name містить рядок, то повертається довжина цього рядка. По суті вираз val length: Int? = name?.length еквівалентно наступному коду:

val length: Int?
if(name != null)
    length = name.length
else
    length = null

За допомогою оператора ?. подібним чином можна звертатися до будь-яких властивостей і функцій об'єкта.

Також в даному випадку ми могли поєднати обидва вище розглянутих оператора:

val name : String?  = "Tom"
val length: Int = name?.length ?:0

Тепер змінна length не допускає значення null. І якщо змінна name не визначена, то length отримує число 0.


Оператор !!

Оператор !! (not-null assertion operator) приймає один операнд. Якщо операнд дорівнює null, то генерується виключення kotlin.KotlinNullPointerException. Якщо операнд НЕ дорівнює null, то повертається його значення.

val name : String?  = "Tom"
val id: String = name!!
println(id)

Оскільки даний оператор повертає об'єкт, який не представляє nullable-тип, то після застосування оператора ми можемо звернутися до методів і властивостей цього об'єкта:

val name : String?  = null
val length :Int = name!!.length

Наш партнер:
beta test mp3 playlist downloader