Объявления объектов
Часть раздела Объектно-ориентированное программирование путешествия по Kotlin на Coddy. Урок 12 из 57.
object Name { ... } объявляет класс и его единственный экземпляр за один шаг. Вы используете объект по его имени; конструктора, который нужно вызвать, нет:
object AppConfig {
var theme = "light"
val version = "1.4"
fun describe() = "v$version, $theme theme"
}Внутри main:
println(AppConfig.describe())
AppConfig.theme = "dark"
println(AppConfig.describe())Результат:
v1.4, light theme
v1.4, dark themeСуществует ровно один экземпляр, поэтому каждая часть программы, использующая объект, читает и изменяет одно и то же состояние. Объект создаётся при первом обращении к нему, как показано в блоке init ниже:
object Visits {
var count = 0
private set
init { println("Visits created") }
fun record() { count++ }
}
fun home() = Visits.record()
fun about() { Visits.record(); Visits.record() }Внутри main:
println("start")
home()
about()
println(Visits.count)Вывод:
start
Visits created
3У объекта нет конструктора, потому что его никто не создаёт. Его свойства получают значения в объявлениях или в init. В остальном это обычное тело класса: закрытое состояние, закрытые вспомогательные функции и публичные методы:
object IdGenerator {
private var next = 1
fun newId(prefix: String) = "$prefix-${pad(next++)}"
private fun pad(n: Int) = n.toString().padStart(3, '0')
}Внутри main:
println(IdGenerator.newId("user"))
println(IdGenerator.newId("order"))Результат:
user-001
order-002Используйте объект для того, чего в программе существует ровно по одному экземпляру: реестра, конфигурации или группы вспомогательных функций. Объект представляет собой глобальное состояние, которое может изменять любой файл, поэтому держите его сеттеры приватными и позвольте его методам проверять каждое изменение.
object Units {
fun kmToMiles(km: Double) = km * 0.621371
}
Units.kmToMiles(10.0) // вызывается через имя
// val u = Units() // ошибка: у объекта нет конструктораЗадание
ЛегкоЗавершите объект Leaderboard. Он хранит очки каждого игрока в приватной карте. add(player, points) добавляет очки, top() возвращает лидера в виде ada 6 (при равном количестве очков — имя, которое идёт первым в алфавитном порядке) или empty, если ни у кого нет очков, reset() удаляет всех игроков, а свойство players содержит количество игроков.
Вспомогательные функции recordWin и recordDraw в Functions.kt уже предоставлены: они используют Leaderboard из другого файла. Предоставленный код считывает команды win ada, draw ada bo, top или reset, выводит top() для каждой команды top, а в конце — players: с количеством игроков.
Ваш код должен находиться в Leaderboard.kt и Functions.kt. В Main.kt содержится предоставленный код ввода/вывода, и его нельзя изменять.
Попробуйте сами
fun main() {
// Предоставленный код ввода/вывода: оставьте его как есть
val input = generateSequence(::readLine).toList()
for (cmd in input) {
val p = cmd.split(" ")
when (p[0]) {
"win" -> recordWin(p[1])
"draw" -> recordDraw(p[1], p[2])
"reset" -> Leaderboard.reset()
else -> println(Leaderboard.top())
}
}
println("players: ${Leaderboard.players}")
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовПервичные конструкторыБлоки init и валидацияВторичные конструкторыПовторение — читательский билет4Наследование
Открытые классы и подклассыПереопределение членовsuper и конструкторыАбстрактные классыПовторение — каталог сотрудников7Специальные классы
Классы данныхКлассы перечисленийЗапечатанные иерархииequals, hashCode, toStringПовторение — трекер заказов10Паттерны проектирования. Часть 2
Делегирование с помощью byПаттерн декораторПаттерн строительПаттерн состояние2Свойства и инкапсуляция
Пользовательские аксессорыМодификаторы видимостиПриватные сеттерыlazy и lateinitПовторение — банковский счёт5Интерфейсы
Объявление интерфейсовМетоды по умолчаниюМножественные интерфейсыИнтерфейсы как типыПовторение — способы оплаты8Обобщения
Обобщённые функцииОбобщённые классыОграничения типовВариативность с in и outПовторение — очередь с приоритетом11Проект: Управление библиотекой
Книги и читателиВыдача книг3Объекты и компаньоны
Объявления объектовОбъекты-компаньоныКонстанты с constОбъектные выраженияПовторение — билетная касса6Полиморфизм
Динамическая диспетчеризацияПроверка типов и умные приведения типовwhen с типамиФункции-расширенияПовторение — смотритель зоопарка9Паттерны проектирования. Часть 1
Паттерн «Одиночка»Фабричный паттернПаттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Песочница Kotlin