Kotlin Developer
6.22K subscribers
259 photos
8 videos
354 links
Самый топовый канал по Kotlin

По вопросам сотрудничества и рекламы: @NadikaKir

Мы на бирже: https://telega.in/c/KotlinSenior
Download Telegram
Кратко про анонимные классы и объекты, object и companion object

Анонимные классы
— это классы, которые явно не объявлены с помощью class, наследуется от заданного класса или реализует заданный интерфейс.

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

val obj = object : SuperClassOrInterface() {
// implementation here
}

Объекты анонимных классов полезны для одноразового использования.

Экземпляры анонимных классов называют анонимными объектами, потому что они объявляются выражением, а не именем. Анонимный объект начинается с ключевого слова object.

• можно задавать свойства, функции, блоки инициализации;

• можно наследоваться от других классов и реализовывать интерфейсы;

нельзя создавать конструкторы (как основные, так и вторичные).

Ключевое слово object позволяет одновременно объявить класс и создать его экземпляр (т.е. объект). При этом применять его можно по-разному:

• object Name — это объявление объекта (оbject declaration), реализация паттерна Singleton;

• companion object — это объект-компаньон внутри класса (также Singleton);

• object — это объект-выражение (анонимный объект/object expression), не Singleton.
Расширяем Android Lint

Часто при разработке собственных фреймворков (или для проверки соответствия кода требованиям организации) возникает необходимость реализовать сложные проверки корректности использования в коде приложения. Это может быть реализовано через расширение возможностей линтера, который используется в Android Studio. В этой статье мы рассмотрим общие подходы к созданию таких расширений для Android-приложений и несколько примеров для проверки названий функций и наличия аннотаций.

Читать статью
Объявление объекта (object declaration), object как Singleton

Объявляется объект при помощи ключевого слова object, после которого следует имя объекта.

Файл, содержащий только object представляет из себя Singleton, т.е. будет создан только один экземпляр этого класса. Пример:

object One {
val cats = arrayListOf<Cat>()

fun callCat() {
for (cat in cats) {
...
}
}
}

Можно обращаться к методам и свойствам класса через имя объекта:

One.cats.add(Cat(...))
One.callCat()

Инициализация объявления объекта потокобезопасна и выполняется при первом доступе (лениво).
Kotlin 1.8.20

3 Апреля, вышло очередное обновление Kotlin 1.8.20

Вот некоторые изменения:

• Обновления нового компилятора Kotlin K2

• Интерфейс AutoCloseable и Base64 кодировка теперь в стандартной библиотеке

• Новая инкрементальная компиляция JVM, включенная по умолчанию

• Новая экспериментальная платформа сборки Kotlin/Wasm

Читать статью
Сompanion object (также Singleton)

Объекты можно объявлять внутри класса, при этом нет каких-либо ограничений по их количеству. Но только один объект можно пометить ключевым словом companion object в рамках одного класса.

Синглтон-свойство companion object достигается за счет того, что он создается внутри класса в качестве статического поля. Он будет инициализирован при первом обращении к нему или при создании первого экземпляра класса, в котором он объявлен.

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

class MyClass {
init {
// Выполняется всегда после инициализации companion object
}

companion object {
init {
// Выполняется всегда перед блоком init содержащего класса
}
}
}

val myClass = MyClass()

Такому объекту можно не указывать свое имя, и обращаться к методам и свойствам объекта через имя содержащего его класса без явного указания имени объекта.

class SomeClass {

companion object {
fun create()
}
}

val someClass = SomeClass.create()

Компилируется в public static final class на Java. Работает подобно ключевому слову static в Java.
Создание и тестирование процессоров аннотаций (с кодогенерацией) для Kotlin

В разработке с использованием Kotlin (или Java) для создания классов по верхнеуровневому описанию часто используется маркировка аннотациями (например, для моделей таблиц баз данных, сетевых запросов или инъекции зависимостей) и подключение процессоров аннотаций, которые также могут генерировать код, доступный из основного проекта. Запуск процессоров аннотаций выполняется внутри gradle (для Java-проектов через annotationProcessor, для Kotlin - kapt) и встраивается как зависимость для целей сборки проекта. И конечно же, как и для любого другого кода, для процессора аннотаций необходимо иметь возможность разрабатывать тесты. В этой статье мы рассмотрим основы использования кодогенерации (с использованием kapt) и разработки тестов для созданных генераторов кода. Во второй части статьи речь пойдет о разработке процессоров на основе Kotlin Symbol Processing (KSP) и созданию тестов для них.

Читать статью
Объект-выражение (анонимный объект/object expression)

Объект-выражение — это выражение, которое "на ходу" создает анонимный объект.

Для объекта-выражения не указывается имя!
Если же объекту всё-таки требуется имя, то его можно сохранить в переменной:

val tom = object {
val name = "Tom"
var age = 37
fun sayHello() {
println("Hi, my name is $name")
}
}
println("Name: ${tom.name} Age: ${tom.age}")
tom.sayHello()

Анонимные объекты не являются синглтонами!
Каждый раз при выполнении объекта-выражения создаётся новый объект.

Анонимный объект является заменой анонимным внутренним классам в Java.
Многоязычность на Kotlin-бэкэнде

Язык программирования Kotlin часто ассоциируется с мобильной разработкой для Android и это неудивительно, учитывая что он принят Google как официальный язык разработки, и принес множество необходимых и удобных языковых конструкций и кооперативной многозадачности, при этом сохраняя совместимость на уровне байт-кода с ранними версиями JVM. Но применимость языка существенно выше и имеющиеся библиотеки (как созданные для Java, так и разработанные специально для Kotlin) позволяют создавать обычные приложения (например, на JavaFX или с использованием платформенных графических библиотек и Kotlin Native), а также создавать код для бэкэнда c подключениям к базам данных, кэшам, очередям сообщений и т.д. При этом, если для мобильной разработки проблем с поддержкой многоязычных сообщений не возникает (благодаря механизму ресурсов, в том числе строк, которые могут быть переопределены для конкретной локали), то для бэкэнда это становится нетривиальной задачей. В этой статье мы обсудим несколько подходов для создания бэкэнда с поддержкой нескольких языков.

Читать статью
Разница между анонимным и декларируемым (объявляемым) объектом

• анонимный объект (object) инициализируется непосредственно при использовании;

• декларированный (объявляемый) объект (object Name) инициализируется лениво, в момент первого к нему доступа;

• вспомогательный объект (companion object) инициализируется в момент, когда класс, к которому он относится, загружен и семантически совпадает со статическим инициализатором Java.
Создание и тестирование процессора аннотаций и кодогенератора на KSP

В первой части статьи мы рассмотрели подход к обработке аннотаций (и возможной генерации дополнительных исходных текстов), который используется в мире Java и долгое время применялся также для Kotlin (при этом Kotlin-код предварительно преобразовывался в Java-классы, что занимало дополнительное время для компиляции). С 2021 года стал доступен новый плагин для gradle, который основан на непосредственном анализе исходных текстов Kotlin и позволяет генерировать код без необходимости создания текстового файла. В этой статье мы разберемся как создать процессор аннотаций для KSP и как его можно протестировать?

Читать статью
Что произойдет при попытке выполнения кода?
Что произойдет при попытке выполнения кода?
Anonymous Quiz
26%
Выведет TEST 123
35%
Выведет DEBUG 123
32%
Код не скомпилируется
7%
Вылетит с ошибкой
Техника «10 тестов в день» – одна из самых эффективных в изучении Java.

Канал Java Guru выложил в открытый доступ тесты, которые дают на собеседованиях в топовые компании, вроде Яндекс и MailRu.

➤ Открываете задачку – выбираете вариант – видите правильный ответ и детальное объяснение к нему. Так вы усвоите на 50% больше знаний в сжатые сроки.

Подписывайтесь и качайте свои скиллы: @javatasks
Аннотация @JvmStatic

С помощью аннотации @JvmStatic есть возможность объявить методы по настоящему статическими, ее можно добавить как к методам object, так и к методам companion object.

object ObjectWithStatic {
@JvmStatic
fun staticFun(): Int {
return 5
}
}

В этом случае метод staticFun будет действительно объявлен статическим:

public final class ObjectWithStatic {
public static final ObjectWithStatic INSTANCE;

@JvmStatic
public static final int staticFun() {
return 5;
}

private ObjectWithStatic() {
INSTANCE = (ObjectWithStatic)this;
}

static {
new ObjectWithStatic();
}
}
Ни одно задание не будет провалено: Spring Boot и Quartz в режиме cluster

Туториал по настройке библиотеки Quartz в режиме кластера в Spring Boot приложении с возможностью отслеживания и управления жизненным циклом задания, в том числе переносом задания в случае необходимости.

Читать статью
Что такое Null safety, nullable и non-nullable типы?

Null safety
— это концепция безопасности, которая предотвращает некоторые из наиболее распространенных ошибок в программировании, связанных с использованием null-значений. В Kotlin эта концепция реализуется за счет строгой типизации и системы Nullable/Non-nullable типов данных.

Nullable типы — это типы, которые могут содержать значение null. Non-nullable типы — это типы, которые не могут содержать значение null и всегда должны иметь некоторое значение.

В Kotlin переменные по умолчанию являются non-nullable — это означает, что они не могут принимать значение null. Если переменная может принимать значение null, то ее нужно объявить с использованием знака вопроса (?). При использовании Nullable переменной в коде Kotlin не допустит обращение к ней без предварительной проверки на null-значение.

Также Kotlin предоставляет множество функций для безопасной работы с nullable-значениями, таких как операторы elvis ?:, безопасный вызов ?. и другие.

В целом, концепция Null safety помогает разработчикам избежать ошибок связанных с null-значениями, уменьшает количество ошибок в работе приложения и упрощает разработку и поддержку кода.
Какое поведение ожидается от такого кода?
От какого класса унаследованы все остальные классы в Kotlin?

Класс Any находится на вершине иерархии — все классы в Kotlin являются наследниками Any. Это стандартный родительский класс для всех классов, которые явно не унаследованы от другого класса. Именно в нем определены equals, hashCode и toString. Класс Any по назначению похож на Object в Java.

public open class Any {
public open operator fun equals(other: Any?): Boolean
public open fun hashCode(): Int
public open fun toString(): String
}