Статьи по Kotlin

Классы в Kotlin: пустые классы, конструкторы и свойства

Классы в Kotlin упрощены так, чтобы написать наибольшую функциональность с наименьшим количеством кода. Синтаксис прост и похож на синтаксис Java (помните, что он следует той же объектно-ориентированной парадигме) с теми же концепциями конструкторов, наследования, интерфейсов, абстрактных классов, что и в Java (хотя и с существенной разницей в обработке свойств).

Пустые классы.

Чтобы определить класс в Kotlin в его минимальном виде, необходимо:

class Vacia
Code language: JavaScript (javascript)

Как мы видим, в Kotlin для создания публичного класса (по умолчанию, поскольку другой тип класса не определен) нет необходимости определять ключи или что-то подобное, поскольку он не имеет свойств или других методов; мы также могли бы определить предыдущий класс с ключами:

class Vacia {}
Code language: JavaScript (javascript)

Хотя они необязательны в зависимости от того, определяем ли мы свойства и методы внутри класса. Но, по крайней мере, мы должны определить класс, который мы можем назвать пустым, то есть не имеющим в себе никаких свойств или методов и ключей.

Создание классов.

Для инстанцирования предыдущего класса это будет выглядеть следующим образом:

val vacia = Vacia ()

Знаки () используются для указания метода конструктора, который в данном примере является конструктором по умолчанию класса Vacia. Также обратите внимание, что мы не используем зарезервированное слово других языков программирования, таких как new, которое используется в Java для указания создания нового объекта.

Класс, внутри которого ничего нет или ничего не определено, не приносит нам особой пользы. Для этого у нас есть свойства, которые мы рассмотрим далее.

Свойства классов Kotlin.

Классы используются для ссылки на объекты, с помощью свойств мы можем определить различные характеристики, которыми мы хотим управлять этим объектом. Например, чтобы определить класс Person в Kotlin с некоторыми свойствами (да, свойствами, а не атрибутами), мы можем сделать следующее:

class Person { var name: String = "" var last_name: String = "" var age: Int = 0 }
Code language: JavaScript (javascript)

Свойства или свойства при замене переменных

Свойства в Kotlin облегчают создание классов, поскольку они заменяют геттеры и сеттеры, которые мы должны использовать в других языках, таких как Java.

Благодаря этому мы достигаем огромного упрощения в количестве кода, который должны создать в наших объектно-ориентированных классах. Нам не нужно определять gets и sets для имени, фамилии и т.д., а достаточно просто объявить свойство, как если бы это была переменная.

Давайте снова создадим экземпляр класса, в данном случае класса Person, и обратимся к свойствам, которые мы определили ранее:

val person = Person() person.name = "Иван" person.last_name = "Иванов"
Code language: JavaScript (javascript)

Получить доступ к каждому из них можно так же просто:

println(person.name) println(person.last_name)
Code language: CSS (css)

Свойства, но не переменные в классах Kotlin

Очень важным моментом является то, о чем мы говорили ранее, что существует изменение концепции между Kotlin и Java. В то время как в Java имя и фамилия для этого примера были бы полями, в Kotlin это свойства. Это приводит к тому, что в Java считается плохой практикой программирования, когда мы обращаемся к полям напрямую.

Но не в Kotlin. В Kotlin методы GET и SET выводятся компилятором, чего не происходит в Java. Это связано с этой разницей концепций, на которую мы указывали ранее.

Переопределение методов get и set.

Мы можем определить свои собственные методы и наборы gets, которые переопределяют те, что задаются по умолчанию или выводятся компилятором Kotlin:

class Person { var name: String = "" get() = field set(value) { field = value } var last_name: String = "" var age: Int = 0 }
Code language: JavaScript (javascript)

Конструкторы классов в Kotlin.

Основы конструирования.

Как и любой объектно-ориентированный язык программирования, Kotlin имеет в классах методы-конструкторы, служащие для инициализации значений класса, как и в Java.

Но в отличие от последнего, Kotlin очень интересным способом, с помощью которого мы экономим несколько строк кода. Главный конструктор работает не как метод внутри функции, а встраивается в класс:

class Person(name: String, last_name: String, age: Int) { var name: String = name var last_name: String = last_name var age: Int = age }

Kotlin определяет главный конструктор как часть класса в заголовке класса, где параметры являются необязательными.
При этом Koltin автоматически устанавливает эквивалентность между параметрами в конструкторе и свойствами, определенными в классе.

Для создания экземпляра, инициализируемого из конструктора, мы должны выполнить следующее:

var person = Person("Иван", "Иванов", 27)
Code language: JavaScript (javascript)

Для понимания этого примера мы могли бы определить метод конструктора следующим образом:

class Persona(name: String, last_name: String, age: Int) { var name: String = "" var last_name: String = "" var age: Int = 0 init { this.name = name this.last_name = last_name this.age = age } }

Этот последний код был бы “путём Java”, в котором мы указываем, какие параметры конструктора инициализируют свойства класса, внутренне, это то, что Kotlin делает с помощью структуры init{}.

Или мы можем упростить его еще больше:

class Person(name: String, last_name: String, age: Int) { var name: String = name var last_name: String = last_name var age: Int = age }

Таким образом, мы удаляем структуру init из нашего кода.

Мы также можем поместить слово constructor после указания имени класса:

class Person constructor (name: String, last_name: String, age: Int) { var name: String = name var last_name: String = last_name var age: Int = age }

Все эти примеры основных конструкторов эквивалентны, но если мы не собираемся проводить валидацию, мы можем оставить его, используя конструктор по умолчанию:

class Person(name: String, last_name: String, age: Int) { var name: String = "" var last_name: String = "" var age: Int = 0 }

Инициализация предыдущего класса.

Независимо от того, какую схему вы предпочитаете, чтобы создать экземпляр класса person с помощью конструктора, мы можем сделать следующее:

var person = Person("Иван","Иванов",27)
Code language: JavaScript (javascript)

Множественные конструкторы (вторичные конструкторы).

Имея в качестве основного конструктора тот, который определяет (name: String, last_name: String, age: Int), мы также определяем вторичные конструкторы, которые определяются вне заголовка класса. Но внутри тела класса, как в данном примере (name: String, last_name: String):

class Persona constructor (name: String, last_name: String, age: Int) { var name: String = "" var last_name: String = "" var age: Int = 0 constructor (name: String, last_name: String) : this(name, last_name, 0) }

Таким образом, вы можете определить столько вторичных конструкторов, сколько захотите.

Или то же самое:

class Persona (name: String, last_name: String, age: Int) { var name: String = name var last_name: String = last_name var age: Int = age constructor (name: String, last_name: String) : this(name, last_name, 0) }

Как мы видим, существует множество комбинаций в зависимости от предпочитаемой схемы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *