Object expression

Object expression позволяет создавать анонимные объекты, которые являются реализациями интерфейсов или наследуются от классов без явного объявления нового подкласса. Такой объект существует только в области видимости, где он был создан, и не имеет имени.

Синтаксис

kotlinval obj = object: SuperType1, SuperType2 {
  // свойства и методы
}

Пример

Создадим анонимный объект, реализующий интерфейс ClickListener:

kotlininterface ClickListener {
  fun onClick()
}

val listener = object: ClickListener {
  override fun onClick() {
    println("Button clicked")
  }
}

listener.onClick()

Результат выполнения кода:

kotlinString "Button clicked"

Пример

Создадим анонимный объект, наследуемый от класса Animal:

kotlinopen 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())

Результат выполнения кода:

kotlinString "Cat"
String "Meow"

Пример

Object expression может реализовывать несколько интерфейсов одновременно:

kotlininterface 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()

Результат выполнения кода:

kotlinString "Function A"
String "Function B"

Пример

Object expression может быть создан без наследования от каких-либо классов или интерфейсов:

kotlinval person = object {
  val name = "John"
  val age = 30
  fun introduce() = "My name is $name and I'm $age years old"
}

println(person.introduce())

Результат выполнения кода:

kotlinString "My name is John and I'm 30 years old"

Пример

Object expression имеет доступ к переменным из окружающей области видимости:

kotlinfun createCounter(): () -> Int {
  var count = 0
  return object {
    fun increment(): Int {
      return ++count
    }
  }.increment
}

val counter = createCounter()
println(counter())
println(counter())

Результат выполнения кода:

kotlinInt 1
Int 2

Смотрите также

  • ключевое слово class,
    которое объявляет именованный класс
  • ключевое слово interface,
    которое объявляет интерфейс
  • ключевое слово object,
    которое создает объект-одиночку
  • ключевое слово companion,
    которое создает companion object