Освой Kotlin играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Ключевое слово object одновременно объявляет класс и создаёт его экземпляр.
С его помощью можно реализовать шаблон "Одиночка". Например, класс для фонда заработной платы (у предприятий только один фонд), класс для печати (обработка заданий для принтера), Wi-Fi (общие настройки связи) и т.д.
Также можно реализовать объект-компаньон, содержащий лишь фабричные методы, а также методы, связанные с классом, но не требующие обращения к его экземпляру. К членам такого объекта можно обращаться просто по имени класса.
Ещё можно использовать для записи объекта-выражения в качестве замены анонимного внутреннего класса.
Иногда требуется класс, который должен существовать в одном экземпляре. В Kotlin имеется специальный синтаксис объявления объекта для подобных случаев.
object One {
val cats = arrayListOf<Cat>()
fun callCat() {
for (cat in cats) {
...
}
}
}
Вы можете задавать свойства, методы, блоки инициализации, но не можете создавать конструкторы (как основные, так и вторичные).
Обращаться к методам и свойствам класса можно через имя объекта.
One.cats.add(Cat(...))
One.callCat()
Объекты также можно объявлять внутри существующего класса.
Ключевое слово object можно использовать не только для объявления одиночек, но и для создания анонимных объектов, которые являются заменой анонимных внутренних классов в Java.
В Kotlin 1.9 появились объекты данных. data object — это обычный object, но с реализацией по умолчанию функции toString(), которая выводит его имя без ручного её переопределения и с соответствием поведения определению data class. Соответствие поведения классам данных особенно актуально для иерархий запечатанных классов.
sealed interface ProfileScreenState {
data class Success(val username: String) : ProfileScreenState
data object Error : ProfileScreenState
data object Loading : ProfileScreenState
}
Объекты данных — это новый функционал Kotlin, который улучшает строковое представление object. Он особенно актуален, когда имеются иерархии запечатанных классов с другими классами данных и их нужно занести в журнал или распечатать для отладки или аналитики.