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.