Object expression
Object expression позволяет создавать анонимные объекты, которые являются реализациями интерфейсов или наследуются от классов без явного объявления нового подкласса. Такой объект существует только в области видимости, где он был создан, и не имеет имени.
Синтаксис
val obj = object: SuperType1, SuperType2 {
// свойства и методы
}
Пример
Создадим анонимный объект, реализующий интерфейс ClickListener:
interface ClickListener {
fun onClick()
}
val listener = object: ClickListener {
override fun onClick() {
println("Button clicked")
}
}
listener.onClick()
Результат выполнения кода:
String "Button clicked"
Пример
Создадим анонимный объект, наследуемый от класса Animal:
open class Animal(val name: String) {
open fun makeSound() = "Unknown sound"
}
val cat = object: Animal("Cat") {
override fun makeSound() = "Meow"
}
println(cat.name)
println(cat.makeSound())
Результат выполнения кода:
String "Cat"
String "Meow"
Пример
Object expression может реализовывать несколько интерфейсов одновременно:
interface A {
fun funcA()
}
interface B {
fun funcB()
}
val obj = object: A, B {
override fun funcA() {
println("Function A")
}
override fun funcB() {
println("Function B")
}
}
obj.funcA()
obj.funcB()
Результат выполнения кода:
String "Function A"
String "Function B"
Пример
Object expression может быть создан без наследования от каких-либо классов или интерфейсов:
val person = object {
val name = "John"
val age = 30
fun introduce() = "My name is $name and I'm $age years old"
}
println(person.introduce())
Результат выполнения кода:
String "My name is John and I'm 30 years old"
Пример
Object expression имеет доступ к переменным из окружающей области видимости:
fun createCounter(): () -> Int {
var count = 0
return object {
fun increment(): Int {
return ++count
}
}.increment
}
val counter = createCounter()
println(counter())
println(counter())
Результат выполнения кода:
Int 1
Int 2