Сообщения

Константы времени компиляции в Kotlin

Изображение
Если значение свойства только для чтения известно во время компиляции, отметьте его как постоянную времени компиляции с помощью модификатора const. Такие свойства должны соответствовать следующим требованиям: Верхний уровень или член объявления объекта или сопутствующий объект (companion object). Инициализируется значением типа String или примитивным типом Нет специального получателя Такие свойства можно использовать в аннотациях: const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated" @Deprecated(SUBSYSTEM_DEPRECATED) fun foo() { ... } Свойства и переменные с поздней инициализацией Обычно свойства, объявленные как имеющие ненулевой тип, должны быть инициализированы в конструкторе. Однако довольно часто это не удобно. Например, свойства могут быть инициализированы с помощью внедрения зависимостей или с помощью метода настройки модульного теста. В этом случае вы не можете указать в конструкторе инициализатор, отличный от null, но вы все равно хо

Объявление свойств, геттеры и сеттеры в Kotlin

Изображение
Объявление свойств Свойства в классах Kotlin могут быть объявлены либо изменяемыми с помощью ключевого слова var, либо доступными только для чтения с помощью ключевого слова val. class Address { var name: String = "Holmes, Sherlock" var street: String = "Baker" var city: String = "London" var state: String? = null var zip: String = "123456" } Чтобы использовать свойство, просто обратитесь к нему по имени: fun copyAddress(address: Address): Address { // в Kotlin нет ключевого слова new val result = Address() result.name = address.name // вызываются методы доступа result.street = address.street // ... return result } Геттеры и сеттеры Полный синтаксис объявления свойства: var <propertyName>[: <PropertyType>] [= <property_initializer>] [<getter>] [<setter>] Инициализатор, геттер и сеттер не обязательны. Тип свойства является необязательным, е

Наследование в Kotlin

Изображение
Все классы в Kotlin имеют общий суперкласс Any, который является суперклассом по умолчанию для класса без объявленных супертипов: class Example // Неявно наследуется от Any У Any есть три метода: equals(), hashCode() и toString(). Таким образом, они определены для всех классов Kotlin. По умолчанию классы Kotlin являются окончательными: они не могут быть унаследованы. Чтобы сделать класс наследуемым, отметьте его ключевым словом open. open class Base //Класс открыт для наследования Чтобы объявить явный супертип, поместите тип после двоеточия в заголовке класса: open class Base(p: Int) class Derived(p: Int) : Base(p) Если производный класс имеет первичный конструктор, базовый класс может (и должен) быть инициализирован прямо здесь, используя параметры первичного конструктора. Если производный класс не имеет основного конструктора, то каждый вторичный конструктор должен инициализировать базовый тип с помощью ключевого слова super или делегировать другому конструк

Классы в Kotlin

Изображение
Классы в Kotlin объявляются с помощью ключевого слова class: class Invoice { /*...*/ } Объявление класса состоит из имени класса, заголовка класса (с указанием его параметров типа, основного конструктора и т. д.) и тела класса, заключенного в фигурные скобки. И заголовок, и тело не являются обязательными; если у класса нет тела, фигурные скобки можно опустить. class Empty Конструкторы Класс в Kotlin может иметь первичный конструктор и один или несколько вторичных конструкторов. Основной конструктор является частью заголовка класса: он идет после имени класса (и дополнительных параметров типа). class Person constructor(firstName: String) { /*...*/ } Если у основного конструктора нет аннотаций или модификаторов видимости, ключевое слово constructor можно опустить: class Person(firstName: String) { /*...*/ } Основной конструктор не может содержать никакого кода. Код инициализации может быть помещен в блоки инициализатора, которые имеют префикс с ключевым слово

Возврат и прыжки в Kotlin

Изображение
Возврат и прыжки В Kotlin есть три выражения структурного скачка: return. По умолчанию возвращается из ближайшей включающей функции или анонимной функции. break. Завершает ближайший охватывающий цикл. continue. Переходит к следующему шагу ближайшего охватывающего цикла. Все эти выражения можно использовать как часть более крупных выражений: val s = person.name ?: return Тип этих выражений - тип Nothing. Break и Continue метки Любое выражение в Kotlin может быть помечено меткой. Метки имеют форму идентификатора, за которым следует знак @, например: abc@, fooBar@ - допустимые метки. Чтобы обозначить выражение, мы просто ставим перед ним метку loop@ for (i in 1..100) { // ... } Теперь мы можем квалифицировать break или continue с помощью метки: loop@ for (i in 1..100) { for (j in 1..100) { if (...) break@loop } } break, отмеченный меткой, переходит к точке выполнения сразу после цикла, отмеченного этой меткой. continue переходит к следующе

For циклы в Kotlin

Изображение
Цикл for перебирает все, что предоставляет итератор. Это эквивалентно циклу foreach в таких языках, как C#. Синтаксис следующий: for (item in collection) print(item) Тело может быть блоком. for (item: Int in ints) { // ... } Как упоминалось выше, for выполняет итерацию всего, что предоставляет итератор, т.е. имеет функцию-член или функцию расширения iterator(), возвращаемый тип которого имеет функцию-член или функцию расширения next(), и имеет функцию-член или функцию расширения hasNext(), которая возвращает Boolean. Все эти три функции необходимо пометить как operator. Чтобы перебрать диапазон чисел, используйте выражение диапазона: for (i in 1..3) { println(i) } for (i in 6 downTo 0 step 2) { println(i) } Цикл for по диапазону или массиву компилируется в цикл на основе индекса, который не создает объект-итератор. Если вы хотите перебрать массив или список с индексом, вы можете сделать это следующим образом: for (i in array.indices) {

Выражение when в Kotlin

Изображение
Выражение when заменяет оператор switch в C-подобных языках. В простейшем виде это выглядит так when (x) { 1 -> print("x == 1") 2 -> print("x == 2") else -> { // Обратите внимание на блок print("x не равно 1 и не равно 2") } } when сопоставляет свой аргумент со всеми ветвями последовательно, пока не будет выполнено какое-либо условие ветвления. when может использоваться как выражение или как утверждение. Если оно используется как выражение, значение удовлетворенной ветви становится значением всего выражения. Если он используется как утверждение, значения отдельных ветвей игнорируются. (Как и в случае с if, каждая ветвь может быть блоком, а ее значением является значение последнего выражения в блоке.) Ветвь else оценивается, если ни одно из других условий ветвления не удовлетворяется. Если when используется в качестве выражения, ветвь else является обязательной, если компилятор не может доказать, что все возможные сл