English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In questo articolo, con l'aiuto di esempi, imparerai la dichiarazione dell'oggetto (singleton) e l'espressione dell'oggetto.
Un singleton è un modello orientato agli oggetti in cui una classe può avere solo una istanza (oggetto).
Ad esempio, stai sviluppando un'applicazione con backend di database SQL. Vuoi creare un pool di connessioni per accedere al database, e reuse la stessa connessione per tutti i client. Per questo, puoi creare connessioni tramite la classe singleton, in modo che ogni client ottenga la stessa connessione.
Kotlin offre un metodo semplice per creare singleton utilizzando le caratteristiche della dichiarazione dell'oggetto. Per questo, utilizzare la parola chiave object.
object SingletonExample { ... .. ... //Corpo della classe ... .. ... }
Il codice sopra combina una dichiarazione di classe e la dichiarazione dell'istanza singola SingletonExample della classe.
La dichiarazione dell'oggetto può includere proprietà, metodi, ecc. Ma non sono permessi costruttori (ciò ha senso).
Simile agli oggetti delle classi normali, puoi utilizzare il simbolo . per chiamare i metodi e accedere alle proprietà.
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") }
L'output del programma quando viene eseguito è:
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("Prega a Dio.") } fun main(args: Array<String>) { val atheist = object : Person() { override fun pray() = println("Prega a Dio.") } atheist.eat() atheist.talk() atheist.pray() }
L'output del programma quando viene eseguito è:
Mangiare. Parlare con le persone. Non prego. Sono un ateo.
这里,匿名对象存储在变量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("Prega a Dio.") } fun main(args: Array<String>) { val atheist = object : Person("Jack", 29) { override fun pray() = println("Prega a Dio.") } atheist.eat() atheist.talk() atheist.pray() }
L'output del programma quando viene eseguito è:
name: Jack, age: 29 Mangiare. Parlare con le persone. Non prego. Sono un ateo.