Kotlin Конструктори

1. Общ преглед

В този урок ще разгледаме задълбочено конструкторите в Kotlin.

Нека започнем с кратко обобщение на концепцията: ние използваме конструктори за създаване на обекти. Те изглеждат като декларации на методи, но винаги имат същото име като класа и не връщат нищо.

За настройка на проект на Kotlin, погледнете нашия уводен урок.

В Kotlin клас може да има първичен конструктор и един или повече допълнителни вторични конструктори.

В следващите раздели ще разгледаме всеки тип и свързаните с него концепции.

2. Първичен конструктор

Първият начин за създаване на обект в Kotlin е чрез използване на първичен конструктор.

Това е част от заглавката на класа. Параметрите също могат да бъдат полета на класа, които ние поставяме след декларацията на класа.

Нека да разгледаме декларация за основен клас с две свойства и първичен конструктор:

class Person constructor(val name: String, val age: Int? = null)

В този пример декларирахме свойства чрез ключовата дума val . Това се държи по същия начин като обикновените променливи, като се споменава, че свойствата val са само за четене (Java окончателен аналог на ключовата дума).

Ако искаме да променим препратката по-късно, вместо това трябва да използваме ключовата дума var . Не можем обаче да пропуснем типа поле в основния конструктор, тъй като това трябва да е изрично.

В някои случаи можем да пропуснем ключовата дума конструктор . Това е задължително само в два случая: когато използваме анотации, като @Autowired или модификатори на достъп, като частни или защитени .

Също така можем да използваме параметрите по подразбиране на Kotlin в конструкторите.

След това нека видим как можем да използваме нашия основен конструктор:

val person = Person("John") val personWithAge = Person("Mark", 22)

Виждаме, че името на класа е извикване на конструктор. Няма нужда да използвате новата ключова дума.

За справка, нека да разгледаме и Java еквивалента на декларация на конструктор:

class PersonJava { final String name; final Integer age; public PersonJava(String name) { this.name = name; this.age = null; } public PersonJava(String name, Integer age) { this.name = name; this.age = age; } }

Както можете да видите, Java ще се нуждае от много повече код, за да постигне същия резултат.

2.1. Първични конструктори на JVM

Моля, обърнете внимание, че компилаторът ще генерира допълнителен конструктор без параметри в JVM. За тази цел ще създаде екземпляр на обект със стойности по подразбиране.

По този начин Kotlin може да работи добре с такива библиотеки като Jackson или JPA, които използват конструктора no-args за създаване на екземпляри на класове:

class Person(val name: String = "")

3. Инициализиране на свойства от параметри на конструктора

Инициализаторите на свойства от тялото на класа могат да използват основните параметри на конструктора.

Нека трансформираме името в свойството upperCaseName :

class Person(val name: String, val age: Int? = null) { val upperCaseName: String = name.toUpperCase() }

Можем да видим изхода в конзолата, като добавим втория блок init :

init { println("Upper case name is $upperCaseName") }

4. Блокове на инициализатора

Не можем да поставим код в основния конструктор.

Понякога обаче трябва да изпълним някакъв код за инициализация. Добро място за него е блокът на инициализатор, който е с префикс с ключовата дума init .

Блокът на инициализатора се извиква след основния конструктор . На това място също можем да получим достъп до полета на класа.

Един клас може да има един или повече инициални блокове.

Нека добавим блока на инициализатора към нашия клас Person :

init { println("Hello, I'm $name") if (surname.isEmpty()) { throw IllegalArgumentException("Surname cannot be empty!") } }

След това, когато създадем обект от клас Person , ще видим в конзолата:

Hello, I'm John

Бихме хвърлили IllegalArgumentException за празното фамилно име.

Когато имаме много инициални блокове, те ще бъдат изпълнени в същия ред, както се появяват в тялото на класа.

5. Вторичен конструктор

В клас Kotlin можем също да декларираме един или повече вторични конструктори . Вторичните конструктори имат префикс с ключовата дума конструктор :

class Car { val id: String val type: String constructor(id: String, type: String) { this.id = id this.type = type } }

И основното използване:

fun main(args: Array) { val car = Car("1", "sport") val suvCar = Car("2", "suvCar") } 

Всеки вторичен конструктор трябва да делегира на основния конструктор . Ще направим това чрез тази ключова дума.

Нека да преместим нашите свойства в основния конструктор и да модифицираме вторичния конструктор:

class Car(val id: String, val type: String) { constructor(id: String): this(id, "unknown") }

6. Конструктори и наследяване

Можем да използваме първичен конструктор на суперкласа.

Имайте предвид, че всички класове в Kotlin са окончателни по подразбиране. Това означава, че ще трябва да добавим ключовата дума open, за да можем да наследяваме от нашия клас Person .

Нека добавим клас Employee, който наследява от класа Person . И двамата използват първични конструктори:

class Employee(name: String, val salary: Int): Person(name) 

Правейки това, ние предаваме име на основния конструктор на клас Person . Освен това добавяме ново поле, наречено заплата в класа Служител .

7. Заключение

В тази бърза статия обсъдихме различни начини за създаване на конструктори на езика Kotlin. Ние можем да създадем инстанции на нашите полета по много различни начини, според нашите желания.

Изпълнението на всички наши примери може да бъде намерено в проекта Github.

За повече информация относно самите функции на Kotlin, моля, разгледайте нашето въведение в Kotlin.