English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основы Kotlin

Kotlin управление потоком

Функции в Kotlin

Строки в Kotlin

Kotlin面向对象(OOP)

Объявление и выражение объектов Kotlin

В этой статье вы узнаете о объявлениях объектов (singleton) и объектных выражениях с помощью примеров.

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

Singleton - это паттерн面向对象的, в котором один класс может иметь только один экземпляр (объект).
Например, вы разрабатываете приложение с backend SQL-базы данных. Вы хотите создать пул соединений для доступа к базе данных, а также для повторного использования одного и того же соединения всеми клиентами. Для этого вы можете создать соединение через单体 класс, чтобы каждый клиент получал одно и то же соединение.

Kotlin предоставляет простое решение для создания单体 с помощью объекта с помощью ключевого слова object.

object SingletonExample {
    ... .. ...
    //Основная часть класса
    ... .. ...
}

Приведенный выше код объединяет объявление класса и объявления единственного экземпляра SingletonExample.

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

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

Пример: объявление объекта

object Test {}}
    private var a: Int = 0
    var b: Int = 1
    fun makeMe12(): Int {
        a = 12
        return a
    }
}
fun main(args: Array<String>) {
    val result: Int
    result = Test.makeMe12()
    println("b = ${Test.b}")
    println("result = $result")
}

При запуске программы выводится:

b = 1
result = 12

Объявление объектов может наследоваться от классов и интерфейсов так же, как и от обычных классов.

Singleton и инъекция зависимостей

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

Kotlin объектное выражение

Ключевое слово object также может использоваться для создания объектов анонимных классов, называемых анонимными объектами. Если необходимо создать объект, который немного изменяет определенный класс или интерфейс, не требуя для этого создания подкласса, то их можно использовать. Например:

window.addMouseListener(object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        // ...
    }
    override fun mouseEntered(e: MouseEvent) {
        // ...
    }
}

Здесь был объявлен анонимный объект, который является расширением класса MouseAdapter. Программа перегружает два метода MouseAdapter: mouseClicked() и mouseEntered().

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

val obj = object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        // ...
    }
    override fun mouseEntered(e: MouseEvent) {
        // ...
    }
}

Пример: Kotlin объектное выражение

open class Person() {
    fun eat() = println("Еда")
    fun talk() = println("Общение с людьми")
    open fun pray() = println("Молюсь Богу.")
}
fun main(args: Array<String>) {
    val atheist = object : Person() {
        override fun pray() = println("Молюсь Богу.")
    }
    atheist.eat()
    atheist.talk()
    atheist.pray()
}

При запуске программы выводится:

Еда.
Говорить с людьми.
Я не молюсь. Я атеист.

Здесь анонимный объект хранится в переменной atheist, которая реализует класс Person, метод pray() перегружен.

Если класс, реализующий анонимный объект, имеет конструктор с параметрами, то необходимо передать соответствующие параметры конструктора. Например:

open class Person(name: String, age: Int) {
    init {
        println("Имя: $name, Возраст: $age")
    }
    fun eat() = println("Еда")
    fun talk() = println("Общение с людьми")
    open fun pray() = println("Молюсь Богу.")
}
fun main(args: Array<String>) {
    val atheist = object : Person("Jack", 29) {
        override fun pray() = println("Молюсь Богу.")
    }
    atheist.eat()
    atheist.talk()
    atheist.pray()
}

При запуске программы выводится:

имя: Jack, возраст: 29
Еда.
Говорить с людьми.
Я не молюсь. Я атеист.