Статьи Kotlin. Ключевое слово object.
Post
Cancel

Kotlin. Ключевое слово object.

Ключевое слово object позволяет одновременно объявить класс и создать его экземпляр (или другими словами, объект). При этом использовать его можно по-разному:

  • объявление объекта;
  • реализация объекта-компаньона;
  • запись объекта-выражения (также известен как анонимный объект и object expressions).

Объявление объекта

Наверняка вам приходилось хоть раз создавать такой класс, который должен существовать в одном экземпляре. Обычно это реализуется при помощи паттерна проектирования синглтон. В Kotlin же предлагается использовать объявление объекта, которое одновременно сочетает в себе и объявление класса, и создание его единственного экземпляра.

Объявляется объект при помощи ключевого слова object, после которого следует имя объекта.

1
2
3
object SomeObject {
  ...
}

Как и класс, объект может обладать свойствами, функциями, блоками инициализации, может наследоваться от классов и реализовывать интерфейсы. Единственное, что не допускается - основные и вторичные конструкторы.

Объекты можно объявлять внутри класса. Такие объекты тоже существуют в единственном экземпляре, т.е. у любого экземпляра класса будет один и тот же экземпляр объекта.

1
2
3
4
5
6
7
8
9
10
11
12
13
class Someclass {
  ...
  object SomeObject {
    fun create() {
      ...
    }
  }

}

...

val someClass = SomeClass.SomeObject.create()

Объект-компаньон (Companion Object)

Как упоминалось ранее, объекты можно объявлять внутри класса. При этом нет каких-либо ограничений по их количеству. Но лишь один объект можно пометить ключевым словом companion. Такому объекту можно не указывать имя, а к его компонентам обращаться через имя класса, в котором он находится.

1
2
3
4
5
6
7
8
9
10
class SomeClass {

  companion object {
    fun create()
  }
}

...

val someClass = SomeClass.create()

Как правило объекты-компаньоны используются для объявления переменных и функций, к которым требуется обращаться без создания экземпляра класса. Либо для объявления констант. По сути они своего рода замена статическим членам класса (в отличие от Java, в Kotlin нет статики).


Объект-выражение

Объект-выражение - это выражение, которое “на ходу” создает анонимный объект, который в свою очередь является заменой анонимным внутренним классам в Java.

При разработке приложений анонимный объект чаще всего используется для реализации обработчика событий (клики по компонентам экрана).

1
2
3
4
5
button.setOnClickListener(object : View.OnClickListener{
  override fun onClick(v: View?) {
    ...
  }
})

В данном примере создаётся объект, который реализует интерфейс View.OnClickListener и передаётся функции setOnClickListener() в качестве параметра. Этот параметр и является объектом-выражением.

Обратите внимание, что для объекта-выражения не указывается имя. Зачем оно ему, если объект просто передается функции в качестве параметра?

Если же объекту всё таки требуется имя, то его можно сохранить в переменной.

1
2
3
val listener = object : View.OnClickListener{
  override fun onClick(v: View?) { ...}
}

В объекте-выражении можно обращаться к переменным, которые находятся в той же функции, в которой был создан анонимный объект.

1
2
3
4
5
6
7
8
9
fun countClicks() {
  var count = 0

  button.setOnClickListener(object : View.OnClickListener{
    override fun onClick(v: View?) {
      count++
    }
  })
}

Анонимный объект может реализовывать несколько интерфейсов, тогда они перечисляются через запятую. А может и вовсе не реализовывать ни один.

1
2
3
4
5
val tree = object {
    var name = "Сосна"
    var description = "хвойное дерево с длинными иглами и округлыми шишками"
}
print("${tree.name} - ${tree.description}.")

Обратите внимание, что анонимные объекты не являются синглтонами. Каждый раз при выполнении объекта-выражения создаётся новый объект.


Полезные ссылки

Object Expressions and Declarations - официальная документация.
Анонимные объекты и объявление объектов - неофициальный перевод документации на русский язык.
Kotlin: статика, которой нет - статья об использовании статики в Kotlin. Есть немного про объекты - сравнение кода Java - Kotlin.

This post is licensed under CC BY 4.0 by the author.

RecyclerView

Kotlin. Лямбда-выражения и анонимные функции