Анонимный object в Kotlin
Object expression не обязан наследовать класс.
Запись object { ... } создаёт анонимный
объект с методами и свойствами внутри блока:
fun main() {
val panel = object {
val title = "Settings"
fun line(): String = "[$title]"
}
println(panel.line())
}
Тип такой переменной компилятор выводит сам -
это не Any, а уникальный анонимный тип.
Поэтому метод line() доступен только
через эту переменную, пока область видимости
не закончилась.
Анонимный объект удобен, когда нужен маленький
набор полей и команд в одном месте, без отдельного
файла и без верхнеуровневого object:
fun audit(action: () -> Unit) {
val stamp = object {
val started = System.currentTimeMillis()
fun done(): Long = System.currentTimeMillis() - started
}
action()
println(stamp.done())
}
fun main() {
audit { Thread.sleep(10) }
}
Сравнение трёх форм в одном месте:
object Name
|
один общий экземпляр, имя типа известно везде в модуле |
companion object
|
члены привязаны к class, вызов через
ClassName
|
| object expression | новый объект в точке кода, имя типа не объявляют отдельно |
В main создайте анонимный object
со свойством version = 3 и методом
tag(): String, возвращающим строку
"v3". Выведите результат tag().
Напишите функцию pack(a: Int, b: Int),
которая возвращает анонимный объект с методом
sum(): Int. Вызовите из main
с числами 4 и 9 и выведите сумму.