English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In diesem Artikel werden Sie mit Hilfe von Beispielen die Objekterklärung (Singleton) und die Objekterklärung (Expression) kennenlernen.
Ein Singleton ist ein objektorientiertes Muster, bei dem eine Klasse nur eine Instanz (Objekt) haben kann.
Zum Beispiel entwickeln Sie eine Anwendung mit einem SQL-Datenbank-Backend. Sie möchten einen Verbindungspool erstellen, um auf die Datenbank zuzugreifen und gleichzeitig die gleiche Verbindung für alle Clients zu verwenden. Dafür können Sie über die Singleton-Klasse Verbindungen erstellen, damit jeder Client die gleiche Verbindung erhält.
Kotlin bietet eine einfache Methode zur Erstellung von Singleton-Objekten mit der Eigenschaft der Objekterklärung. Dafür wird der Schlüsselwort object verwendet.
object SingletonExample { ... .. ... //Klassenkörper ... .. ... }
Der obige Code kombiniert eine Klassenanweisung und die Erklärung eines einzelnen Beispiels der Klasse SingletonExample.
Eine Objekterklärung kann Eigenschaften, Methoden usw. enthalten. Sie erlauben jedoch keine Konstruktoren (was auch immer der Grund dafür ist).
Ähnlich wie bei Objekten einer normalen Klasse können Sie das .-Symbol verwenden, um Methoden aufzurufen und Eigenschaften abzurufen.
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") }
Die Ausgabe beim Ausführen des Programms ist:
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("Gott beten.")}} } fun main(args: Array<String>) { val atheist = object : Person() { override fun pray() = println("Ich bete nicht. Ich bin ein Atheist.") } atheist.eat() atheist.talk() atheist.pray() }
Die Ausgabe beim Ausführen des Programms ist:
Essen. Mit Menschen sprechen. Ich bete nicht. Ich bin ein Atheist.
这里,匿名对象存储在变量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("Gott beten.")}} } fun main(args: Array<String>) { val atheist = object : Person("Jack", 29) { override fun pray() = println("Ich bete nicht. Ich bin ein Atheist.") } atheist.eat() atheist.talk() atheist.pray() }
Die Ausgabe beim Ausführen des Programms ist:
name: Jack, age: 29 Essen. Mit Menschen sprechen. Ich bete nicht. Ich bin ein Atheist.