English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этой статье вы узнаете о объявлениях объектов (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
Объявление объектов может наследоваться от классов и интерфейсов так же, как и от обычных классов.
Объявление объектов иногда может быть полезным. Однако, они не идеальны в больших системах программного обеспечения, взаимодействующих со многими другими частями системы.
Ключевое слово 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) { // ... } }
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 Еда. Говорить с людьми. Я не молюсь. Я атеист.