English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dans cet article, vous découvrirez les déclarations d'objet (singleton) et les expressions d'objet à l'aide d'exemples.
Un singleton est un patron orienté objet où une classe ne peut avoir qu'une seule instance (objet).
Par exemple, si vous développez une application avec un backend de base de données SQL, vous souhaitez créer un pool de connexions pour accéder à la base de données tout en réutilisant la même connexion pour tous les clients. À cette fin, vous pouvez créer une connexion via une classe singleton afin que chaque client obtienne la même connexion.
Kotlin propose une méthode simple pour créer un singleton en utilisant les caractéristiques de déclaration d'objet. Pour cela, utilisez le mot-clé object.
object SingletonExample { ... .. ... //Corps de la classe ... .. ... }
Le code ci-dessus combine une déclaration de classe et la déclaration de l'instance unique SingletonExample de cette classe
Une déclaration d'objet peut inclure des propriétés, des méthodes, etc. Mais, elles ne permettent pas de constructeur (ce qui est logique).
Les objets de classes ordinaires peuvent être utilisés pour appeler des méthodes et accéder aux propriétés avec le point (.).
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: $name, age: $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() }
运行该程序时,输出为:
name: Jack, age: 29 吃东西。 与人交谈。 我不祈祷。我是一个无神论者。