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 ООП властивості


Кожен клас може зберігати деякі дані або стан (state) у вигляді властивостей. Властивості представляють змінні, визначені на рівні класу з ключовими словами val і var. Якщо властивість визначено за допомогою val, то значення такого властивості можна встановити тільки один раз, тобто воно immutable. Якщо властивість визначено за допомогою var, то значення цієї властивості можна багаторазово змінювати.

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

class Person{
    var name: String = "Tom"
    var age: Int = 18
}

В даному випадку в класі Person, який описує людину, визначені властивості name (ім'я людини) і age (вік людини). І ці властивості ініціалізовані початковими значеннями.

Оскільки ці властивості визначені з var, то ми можемо змінити їх початкові значення:

fun main(args: Array<String>) {
 
    val bob: Person = Person()  // создаем объект
    println(bob.name)       // Tom
    println(bob.age)        // 18
 
    bob.name = "Bob"
    bob.age = 25
 
    println(bob.name)       // Bob
    println(bob.age)        // 25
}
 
class Person{
    var name: String = "Tom"
    var age: Int = 18
}

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

val personName : String = bob.name

Установка значення властивості:

bob.name = "Bob"

Геттери і сеттери

Для кожного властивості можна визначати геттер і сетер.


добувач

Геттер управляє отриманням значення властивості і визначається за допомогою слова get :

class Person{
    var name: String = "Tom"
    var age: Int = 18
 
    val info: String
        get() = "Name: $name  Age: $age"
}

Тут властивість info визначає блок get, який повертає інформацію з ім'ям і віком людини. Тобто при отриманні значення властивості ми будемо отримувати саме ті дані, які повертаються блоком get.

Варто відзначити, що властивість, яка визначена за допомогою val і у якої явно визначений блок get, можна не форматувати. Також варто відзначити, що ця властивість незмінна, ми не можемо ззовні явно змінити її значення, так як вона визначена за допомогою val. Однак ми можемо змінити ім'я і вік, і тоді властивість info буде повертати змінену інформацію:

fun main(args: Array<String>) {
 
    val bob: Person = Person()
    bob.name = "Bob"
    bob.age = 25
 
    println(bob.info)   // Name: Bob    Age: 25
    // bob.info = "qwerty" // так нельзя - свойство info неизменяемое
}

сетер

Сетер визначає логіку установки значення. Він визначається за допомогою слова set . Наприклад, вище визначено властивість age, яке зберігає вік користувача, але теоретично ми можемо встановити будь-який вік: 2, 6, -200, 100500. І не всі ці значення будуть коректними. Наприклад, у людини не може бути негативного віку. І для перевірки вхідних значень можна використовувати сетер:

class Person{
    var name: String = "Tom"
     
    var age: Int = 18
    set(value){
        if((value>0) and (value <110))
            field = value
    }
 
    val info: String
        get() = "Name: $name  Age: $age"
}

Блок set визначається також, як і блок get, відразу після властивості, при цьому блок set фактично являє собою функцію, яка приймає один параметр - value, через цей параметр передається встановлюється значення. Наприклад, у виразі bob.age = 25 число 25 і буде представляти той об'єкт, який буде зберігатися в value.

У блоці set перевіряємо, чи входить встановлюється значення в діапазон допустимих значень. Якщо входить, тобто якщо значення коректно, то передаємо його об'єкту field. Якщо значення некоректно, то властивість просто зберігає своє попереднє значення.

Ідентифікатор field представляє автоматично генерується поле, яке безпосередньо зберігає значення властивості. Тобто властивості фактично представляють надбудову над полями, але безпосередньо в класі ми не можемо визначати поля, ми можемо працювати тільки з властивостями. Варто зазначити, що до поля через ідентифікатор field можна звернутися тільки в Геттера або в сетер, і в кожному конкретному властивості можна звертатися тільки до свого поля.

Використовуємо сетер:

fun main(args: Array<String>) {
 
    val bob: Person = Person()
    bob.name = "Bob"
    bob.age = 25        // вызываем сеттер
 
    println(bob.info)   // Name: Bob    Age: 25
    bob.age = -8        // вызываем сеттер
    println(bob.info)   // Name: Bob    Age: 25
}

При другому зверненні до сетера ( bob.age = -8 ) можна помітити, що значення властивості age не змінилося. Так як нове значення -8 не входить в діапазон від 0 до 110.

Можна використовувати одночасно і геттер, і сетер:

class Person{
    var name: String = "Tom"
    get(){
        return  field.toUpperCase()
    }
    set(value){
        if(value.length > 2)
            field = value
    }
 
    var age: Int = 18
    set(value){
        if((value > 0) and (value < 110))
            field = value
    }
 
    val info: String
        get() = "Name: $name  Age: $age"
}

Тут для властивості name додані геттер і сетер. У блоці get повертається ім'я людини через field, причому для символів імені застосовується великі букви. У блоці set встановлюється ім'я людини, якщо встановлюється значення має більше двох символів.


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