Kotlin erweitert das klassische Konzept des Singletons durch das Schlüsselwort object. Damit werden folgende Muster implementiert:
object Logger { ... }).Beispiel eines Singleton-Objekts:
object DatabaseManager { fun connect() { /*...*/ } } DatabaseManager.connect()
Objekt-Ausdruck:
val listener = object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { /*...*/ } }
Begleitobjekt:
class User { companion object Factory { fun create(name: String) = User() } } val user = User.create("Ivan")
Nuancen:
Was ist der Unterschied zwischen companion object und object declaration? Sind alle ihre Mitglieder als statisch zugänglich?
Antwort:
object declaration - globaler Singleton, Mitglied einer Klasse, Schnittstelle oder äußeren Ebene.companion object - eine besondere Art der Object Declaration innerhalb einer Klasse, deren Mitglieder als ob sie statisch sind (über den Klassennamen) aufgerufen werden können. Im Gegensatz zu Java sind sie jedoch tatsächlich Felder des Singleton-Objekts.Beispiel für den Unterschied:
class A { companion object { fun foo() {} } object NestedObj { fun bar() {} } } A.foo() // OK A.NestedObj.bar() // OK, aber das ist keine statische Methode
Geschichte
Ein Entwickler definierte einen veränderbaren Zustand innerhalb einer Object Declaration und begann, ihn aus verschiedenen Threads ohne Synchronisierung zu verwenden, ohne zu beachten, dass Singleton-Objekte im gesamten Programm geteilt werden und zu einem Race Condition führen können.
Geschichte
Bei der Deklaration eines Objekts anstelle eines companion object innerhalb einer Klasse war die Verwendung statischer Methoden erforderlich, aber sie mussten über die Instanz aufgerufen werden, was die Lesbarkeit verschlechterte und zu Fehlern bei der Migration von Java führte.
Geschichte
Im UI-Code erstellte der Programmierer jedes Mal ein neues Objekt über einen Objekt-Ausdruck für den Ereignis-Handler. Er nahm fälschlicherweise an, dass es sich um einen Singleton handelte und der Zustand erhalten bleibt; in der Folge traten Speicherlecks auf, aufgrund falscher Handhabung des Lebenszyklus.