Каким будет результат выполнения следующего кода?
Anonymous Quiz
10%
0 1 2 3 4
69%
1 2 3 4 5
7%
2 3 4 5 6
14%
Ошибка компиляции из-за двух точек
Чем Any в Kotlin отличается от Object в Java?
Any не является полным аналогом java.lang.Object.
В Object 11 методов в классе, в Any только 3 метода: equals(), hashCode() и toString(). При импорте типов Java в Kotlin все ссылки типа java.lang.Object преобразуются в Any. Поскольку Any не зависит от платформы, он объявляет только toString(), hashCode() и equals() в качестве своих членов, поэтому, чтобы сделать другие члены java.lang.Object доступными, Kotlin использует функции расширения.
Несмотря на то, что классы Object и Any имеют сходства (корневые классы иерархии классов), они также имеют и отличия, связанные с языковыми особенностями Kotlin и Java:
1. Класс Any в Kotlin является не только базовым классом для пользовательских классов, но также и супертипом для всех не-nullable типов данных, включая примитивные. В то время как в Java, класс Object является базовым классом только для пользовательских классов.
2. В Kotlin все классы наследуются от Any неявно, в то время как в Java, необходимо явно указывать наследование от Object.
3. Класс Any в Kotlin также имеет nullable версию Any?, которая является супертипом для всех nullable типов данных в Kotlin. В то время как в Java, класс Object не имеет nullable версии.
Any не является полным аналогом java.lang.Object.
В Object 11 методов в классе, в Any только 3 метода: equals(), hashCode() и toString(). При импорте типов Java в Kotlin все ссылки типа java.lang.Object преобразуются в Any. Поскольку Any не зависит от платформы, он объявляет только toString(), hashCode() и equals() в качестве своих членов, поэтому, чтобы сделать другие члены java.lang.Object доступными, Kotlin использует функции расширения.
Несмотря на то, что классы Object и Any имеют сходства (корневые классы иерархии классов), они также имеют и отличия, связанные с языковыми особенностями Kotlin и Java:
1. Класс Any в Kotlin является не только базовым классом для пользовательских классов, но также и супертипом для всех не-nullable типов данных, включая примитивные. В то время как в Java, класс Object является базовым классом только для пользовательских классов.
2. В Kotlin все классы наследуются от Any неявно, в то время как в Java, необходимо явно указывать наследование от Object.
3. Класс Any в Kotlin также имеет nullable версию Any?, которая является супертипом для всех nullable типов данных в Kotlin. В то время как в Java, класс Object не имеет nullable версии.
Какой тип находится на вершине иерархии типов в Kotlin?
Аналогично Object в Java, к чему можно привести любой тип в Kotlin?
Правильным ответом будет Any?.
Сам по себе класс Any это почти аналог Object, однако, благодаря поддержке nullable и не-nullable типов в Kotlin мы получили Any?. Фактически, Any? соответствует любому типу и null, а Any только любому типу.
Если по порядку:
1. Any является корнем иерархии не-nullable типов.
2. Any? является корнем иерархии nullable типов.
3. Так как Any? является супертипом Any, то Any? находится в самом верху иерархии типов в Kotlin.
Аналогично Object в Java, к чему можно привести любой тип в Kotlin?
Правильным ответом будет Any?.
Сам по себе класс Any это почти аналог Object, однако, благодаря поддержке nullable и не-nullable типов в Kotlin мы получили Any?. Фактически, Any? соответствует любому типу и null, а Any только любому типу.
Если по порядку:
1. Any является корнем иерархии не-nullable типов.
2. Any? является корнем иерархии nullable типов.
3. Так как Any? является супертипом Any, то Any? находится в самом верху иерархии типов в Kotlin.
Circuit-фреймворк для Jetpack Compose и тестирование с Robolectric
Тестирование приложений Jetpack Compose обычно основано на использовании библиотеки Compose UI Test и создании юнит-тестов поверх библиотек мокирования или DI. Однако этот подход требует наличия эмулятора и не всегда применим для использования в конвейере CI/CD, где обычно используется Robolectric вместо настоящего Android Runtime. При этом нередко в тестах используется скриншотное тестирование (например, через использование captureToImage в Compose UI Test) и сравнение рендеров с образцом, что изначально недоступно в Robolectric из-за особенностей рендеринга. В этой статье мы рассмотрим использование библиотеки Roborazzi, которая решает эту проблему, совместно с новым подходом к архитектуре Jetpack Compose приложений, которая была предложена Slack в библиотеке Circuit.
Читать статью
Тестирование приложений Jetpack Compose обычно основано на использовании библиотеки Compose UI Test и создании юнит-тестов поверх библиотек мокирования или DI. Однако этот подход требует наличия эмулятора и не всегда применим для использования в конвейере CI/CD, где обычно используется Robolectric вместо настоящего Android Runtime. При этом нередко в тестах используется скриншотное тестирование (например, через использование captureToImage в Compose UI Test) и сравнение рендеров с образцом, что изначально недоступно в Robolectric из-за особенностей рендеринга. В этой статье мы рассмотрим использование библиотеки Roborazzi, которая решает эту проблему, совместно с новым подходом к архитектуре Jetpack Compose приложений, которая была предложена Slack в библиотеке Circuit.
Читать статью
Teletype
Circuit-фреймворк для Jetpack Compose и тестирование с Robolectric
Тестирование приложений Jetpack Compose обычно основано на использовании библиотеки Compose UI Test и создании юнит-тестов поверх...
Кратко о Unit
Тип Unit в Kotlin выполняет ту же функцию, что и void в Java.
Возвращаемый тип можно не указывать, если функция ничего не возвращает. По умолчанию там будет Unit:
Тип Unit в Kotlin выполняет ту же функцию, что и void в Java.
Возвращаемый тип можно не указывать, если функция ничего не возвращает. По умолчанию там будет Unit:
fun knockKnock() {
println("Who’s there?")
}
// то же самое, но с указанным типом Unit
fun knockKnock(): Unit = println("Who’s there?")
Какой фрагмент кода нужно вставить вместо `???` для вывода сортированного по названию (от A до Z) списка книг?
Anonymous Quiz
11%
sort()
43%
sortBy { it.name }
33%
sortedBy { it.name }
13%
forEach { book -> sort(book.name) }
Сколько существует instance Unit (1)?
В стандартной библиотеке Kotlin Unit определён как объект, наследуемый от Any и содержащий единственный метод, переопределяющий toString():
В стандартной библиотеке Kotlin Unit определён как объект, наследуемый от Any и содержащий единственный метод, переопределяющий toString():
public object Unit {Unit является синглтоном (ключевое слово object). Unit ничего не возвращает, а метод toString всегда будет возвращать “kotlin.Unit”. При компиляции в java-код Unit всегда будет превращаться в void.
override fun toString() = "kotlin.Unit"
}
Кратко о Nothing
Nothing является типом, который полезен при объявлении функции, которая ничего не возвращает и не завершается.
Примеры:
• функция, которая выбрасывает exception или в которой запущен бесконечный цикл;
• функция TODO() — public inline fun TODO(): Nothing = throw NotImplementedError();
• в тестах есть функция с именем fail, которая выдает исключение с определенным сообщением:
Nothing является типом, который полезен при объявлении функции, которая ничего не возвращает и не завершается.
Примеры:
• функция, которая выбрасывает exception или в которой запущен бесконечный цикл;
• функция TODO() — public inline fun TODO(): Nothing = throw NotImplementedError();
• в тестах есть функция с именем fail, которая выдает исключение с определенным сообщением:
fun fail(message: String): Nothing {
throw IllegalStateException(message)
}
Назовите подтип всех типов в Kotlin
Nothing в Kotlin — это т.н. bottom type, то есть он является подтипом любого другого типа. Наличие Nothing в системе типов позволяет типизировано выражать то, что без него принципиально невозможно.
Bottom type — это тип, который не имеет значений и предназначен для обозначения невыполнимых ситуаций в программе.
Nothing в Kotlin — это т.н. bottom type, то есть он является подтипом любого другого типа. Наличие Nothing в системе типов позволяет типизировано выражать то, что без него принципиально невозможно.
Bottom type — это тип, который не имеет значений и предназначен для обозначения невыполнимых ситуаций в программе.
Сколько существует instance Nothing (0)?
Nothing — класс, который является наследником любого класса в Kotlin, даже класса с модификатором final. При этом Nothing нельзя создать — у него приватный конструктор. В коде он объявлен так:
Nothing — класс, который является наследником любого класса в Kotlin, даже класса с модификатором final. При этом Nothing нельзя создать — у него приватный конструктор. В коде он объявлен так:
public class Nothing private constructor()
Есть ли аналог Nothing в Java (нет)?
Тип Nothing является особенным, поскольку в Java ему нет аналогов.
Действительно, каждый ссылочный тип Java, включая java.lang.Void, принимает в качестве значения null, а Nothing не принимает даже этого. Таким образом, этот тип не может быть точно представлен в мире Java. Вот почему Kotlin генерирует необработанный тип, в котором используется аргумент типа Nothing:
Тип Nothing является особенным, поскольку в Java ему нет аналогов.
Действительно, каждый ссылочный тип Java, включая java.lang.Void, принимает в качестве значения null, а Nothing не принимает даже этого. Таким образом, этот тип не может быть точно представлен в мире Java. Вот почему Kotlin генерирует необработанный тип, в котором используется аргумент типа Nothing:
fun emptyList(): List<Nothing> = listOf()
// is translated to
// List emptyList() { ... }
Модификаторы доступа — private, protected, internal, public
Классы, объекты, интерфейсы, конструкторы, функции, свойства и их сеттеры могут иметь модификаторы доступа. Геттеры всегда имеют ту же видимость, что и свойства, к которым они относятся. Модификаторы доступа — это ключевые слова, с помощью которых можно задать область действия данных. Они позволяют регулировать уровень доступа к различным частям кода. Локальные переменные, функции и классы не могут иметь модификаторов доступа.
В Kotlin есть четыре модификатора доступа: private, protected, internal и public.
Если модификатор явно не указан, то присваивается значение по умолчанию — public.
Private — доступ к членам класса только в пределах самого класса. То есть, поля и методы с модификатором private недоступны из других классов и даже из наследников.
Protected — доступ к членам класса только в пределах класса и его наследников. То есть, поля и методы с модификатором protected доступны из класса и его наследников, но не из других классов.
Internal — доступ к членам модуля (module). Модуль — это набор файлов, компилирующихся вместе, поэтому все классы, объявленные внутри модуля, могут иметь доступ к членам с модификатором internal.
Public — не ограничивает доступ к членам класса. Поля и методы с модификатором public доступны из любого места программы, включая другие модули.
Классы, объекты, интерфейсы, конструкторы, функции, свойства и их сеттеры могут иметь модификаторы доступа. Геттеры всегда имеют ту же видимость, что и свойства, к которым они относятся. Модификаторы доступа — это ключевые слова, с помощью которых можно задать область действия данных. Они позволяют регулировать уровень доступа к различным частям кода. Локальные переменные, функции и классы не могут иметь модификаторов доступа.
В Kotlin есть четыре модификатора доступа: private, protected, internal и public.
Если модификатор явно не указан, то присваивается значение по умолчанию — public.
Private — доступ к членам класса только в пределах самого класса. То есть, поля и методы с модификатором private недоступны из других классов и даже из наследников.
Protected — доступ к членам класса только в пределах класса и его наследников. То есть, поля и методы с модификатором protected доступны из класса и его наследников, но не из других классов.
Internal — доступ к членам модуля (module). Модуль — это набор файлов, компилирующихся вместе, поэтому все классы, объявленные внутри модуля, могут иметь доступ к членам с модификатором internal.
Public — не ограничивает доступ к членам класса. Поля и методы с модификатором public доступны из любого места программы, включая другие модули.
Каким будет результат выполнения следующего кода?
Anonymous Quiz
17%
Улыбающееся лицо
36%
Грустное лицо
38%
Ошибка компиляции - нельзя перезаписывать встроенные функции (IllegalOverrideException)
9%
Ошибка выполнения - переполнение стека (StackOverflowException)
Разница между var, val, const val
1. var — это изменяемая переменная. После инициализации мы можем изменять данные, хранящиеся в переменной.
Переменные val и const val доступны только для чтения — это неизменяемые переменные.
2. val — константа времени выполнения, т.е. значение можно назначить во время выполнения программы.
3. const val — константа времени компиляции, т.к. значения константам присваивается при компиляции (в момент, когда программа компилируется).
В отличие от val, значение const val должно быть известно во время компиляции.
Особенности const val:
• могут получать значение только базовых типов: Int, Double, Float, Long, Short, Byte, Char, String, Boolean.
• объявляются в глобальной области видимости, то есть за пределами функции main() или любой другой функции.
• нет пользовательского геттера.
1. var — это изменяемая переменная. После инициализации мы можем изменять данные, хранящиеся в переменной.
Переменные val и const val доступны только для чтения — это неизменяемые переменные.
2. val — константа времени выполнения, т.е. значение можно назначить во время выполнения программы.
3. const val — константа времени компиляции, т.к. значения константам присваивается при компиляции (в момент, когда программа компилируется).
В отличие от val, значение const val должно быть известно во время компиляции.
Особенности const val:
• могут получать значение только базовых типов: Int, Double, Float, Long, Short, Byte, Char, String, Boolean.
• объявляются в глобальной области видимости, то есть за пределами функции main() или любой другой функции.
• нет пользовательского геттера.
Как стоит объявлять свои константы в Kotlin — при помощи companion object или вне класса?
На самом деле оба эти подхода приемлемы. Однако, использование companion object может быть излишним: компилятор Kotlin преобразует companion object во вложенный класс. Слишком много кода для простой константы.
Если вам не требуется поведение, специфичное для companion object, объявляйте константы вне класса, так как это будет способствовать более эффективному байт-коду. Да и сам синтаксис объявления констант вне класса более чистый и читабельный.
На самом деле оба эти подхода приемлемы. Однако, использование companion object может быть излишним: компилятор Kotlin преобразует companion object во вложенный класс. Слишком много кода для простой константы.
Если вам не требуется поведение, специфичное для companion object, объявляйте константы вне класса, так как это будет способствовать более эффективному байт-коду. Да и сам синтаксис объявления констант вне класса более чистый и читабельный.
Как создать анимированные шейдеры в Jetpack Compose
Jetpack Compose — молодой, но бурно развивающийся фреймворк для разработки под Android, который обладает множеством не всегда очевидных фичей. Сегодня я хотел бы описать одну из таких встроенных возможностей: речь идет об использовании OpenGL-шейдеров. Они позволяют делать красивые анимированные интерфейсы.
Читать статью
Jetpack Compose — молодой, но бурно развивающийся фреймворк для разработки под Android, который обладает множеством не всегда очевидных фичей. Сегодня я хотел бы описать одну из таких встроенных возможностей: речь идет об использовании OpenGL-шейдеров. Они позволяют делать красивые анимированные интерфейсы.
Читать статью
Свойства, методы get и set
Свойства класса — это переменные, которые хранят состояние объекта класса. Как и любая переменная, свойство может иметь тип, имя и значение.
В классе можно объявить свойства с помощью ключевого слова var или val. Свойства, объявленные с var, могут быть изменены после их инициализации, а свойства, объявленные с val, только для чтения.
Если get и set методы не были созданы вручную, то для таких свойств Kotlin незаметно сам их генерирует. При этом для свойства, объявленного с val, генерируется get-метод, а для свойства, объявленного с var — и get, и set методы.
Свойства класса — это переменные, которые хранят состояние объекта класса. Как и любая переменная, свойство может иметь тип, имя и значение.
В классе можно объявить свойства с помощью ключевого слова var или val. Свойства, объявленные с var, могут быть изменены после их инициализации, а свойства, объявленные с val, только для чтения.
class Person {При создании своего класса мы хотим сами управлять его свойствами, контролируя то, какие данные могут быть предоставлены или перезаписаны. С этой целью создаются get и set методы (геттеры и сеттеры). Цель get-метода — вернуть значение, а set-метода — записать полученное значение в свойство класса.
var name: String = ""
val age: Int = 0
}
var name: String = ""В данном примере свойство name имеет тип String и начальное значение пустой строки. Геттер возвращает значение свойства, преобразованное к верхнему регистру. Сеттер устанавливает значение свойства с добавлением префикса "Name: " перед переданным значением. Слово field используется для обращения к текущему значению свойства.
get() = field.toUpperCase()
set(value) {
field = "Name: $value"
}
Если get и set методы не были созданы вручную, то для таких свойств Kotlin незаметно сам их генерирует. При этом для свойства, объявленного с val, генерируется get-метод, а для свойства, объявленного с var — и get, и set методы.