English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In this article, you will learn about object declarations (singletons) and object expressions with the help of examples.
Singleton is an object-oriented pattern where a class can have only one instance (object).
For example, if you are developing an application with an SQL database backend, you want to create a connection pool to access the database and reuse the same connection for all clients. For this, you can create connections through a singleton class so that each client gets the same connection.
Kotlin provides a simple method to create singletons using object declaration features. For this, use the object keyword.
object SingletonExample { ... .. ... //Class body ... .. ... }
The above code combines a class declaration with the declaration of a single instance of the class SingletonExample
Object declarations can include properties, methods, etc., but they do not allow a constructor (which is reasonable).
As objects of ordinary classes, you can use the . symbol to call methods and access properties.
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") }
A saída do programa ao executá-lo é:
b = 1 result = 12
As declarações de objetos podem herdar de classes e interfaces como classes normais.
As declarações de objetos às vezes são úteis. No entanto, elas não são ideais em sistemas de software grandes onde interagem com muitas outras partes do sistema.
A palavra-chave object também pode ser usada para criar objetos de classes anônimas, chamados de objetos anônimos. Se precisar criar um objeto que modifique ligeiramente uma classe ou interface sem precisar declarar uma subclasse, pode usá-los. Por exemplo,
window.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { // ... } override fun mouseEntered(e: MouseEvent) { // ... } }
Aqui, foi declarado um objeto anônimo que estende a classe MouseAdapter. O programa sobrescreve dois métodos da MouseAdapter: mouseClicked() e mouseEntered().
Se necessário, pode-se nomear um objeto anônimo e armazená-lo em uma variável. Por exemplo:
val obj = object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { // ... } override fun mouseEntered(e: MouseEvent) { // ... } }
open class Person() { fun eat() = println("Comer.") fun talk() = println("Falar com alguém.") open fun pray() = println("Oro ao Deus.")} } fun main(args: Array<String>) { val atheist = object : Person() { override fun pray() = println("Eu não oro. Sou um ateu.") } atheist.eat() atheist.talk() atheist.pray() }
A saída do programa ao executá-lo é:
Coma. Converse com as pessoas. Eu não oro. Sou um ateu.
Aqui, o objeto anônimo é armazenado na variável atheist, que implementa a classe Person, e o método pray() é sobrescrito.
Se a classe implementada tiver um construtor que declara um objeto anônimo,则需要传递适当的构造函数参数。例如,
open class Person(name: String, age: Int) { init { println("nome: $name, idade: $age") } fun eat() = println("Comer.") fun talk() = println("Falar com alguém.") open fun pray() = println("Oro ao Deus.")} } fun main(args: Array<String>) { val atheist = object : Person("Jack", 29) { override fun pray() = println("Eu não oro. Sou um ateu.") } atheist.eat() atheist.talk() atheist.pray() }
A saída do programa ao executá-lo é:
name: Jack, age: 29 Coma. Converse com as pessoas. Eu não oro. Sou um ateu.