Object expression в Kotlin
Object expression - выражение, которое сразу создаёт объект. Ему не задают отдельное имя типа на уровне файла: результат можно сохранить в переменную или передать дальше.
Если нужно изменить поведение существующего
класса, указывают базовый тип после двоеточия
и переопределяют методы. Базовый класс должен
быть open, иначе переопределить метод
нельзя - это правило наследования из раздела
про open class:
open class Formatter {
open fun format(value: Int): String =
"num:$value"
}
fun main() {
val hex: Formatter = object : Formatter() {
override fun format(value: Int): String =
"0x${value.toString(16)}"
}
println(hex.format(255))
}
Тип переменной здесь Formatter - снаружи
виден базовый класс, внутри работает переопределённая
логика. Такой объект живёт, пока на него есть
ссылка; это не singleton уровня object Name.
Object expression можно создавать и внутри функции - для одноразового поведения в одном месте вызова:
open class Tag {
open fun label(): String = "raw"
}
fun buildTag(): Tag = object : Tag() {
override fun label(): String = "custom"
}
fun main() {
println(buildTag().label())
}
Именованный object объявляют один раз
на модуль; object expression пишут там, где нужен
единственный особый экземпляр без нового имени
типа в проекте.
Сделайте open class Greeter с методом
message(): String, возвращающим
"hello". Сохраните в g object
expression, переопределив message() так,
чтобы он возвращал "hi". Выведите
g.message().
Сделайте open class Doubler с
open fun transform(n: Int): Int = n.
Передайте в функцию run(d: Doubler, x: Int)
object expression, в котором transform
удваивает число. Выведите результат
run(..., 5).