Ein Companion Object (companion object) in Kotlin ist ein innerhalb einer Klasse mit dem Schlüsselwort companion deklariertes Objekt, das es ermöglicht, statische Methoden und Eigenschaften zu gruppieren, ähnlich wie statische Mitglieder in Java. Im Gegensatz zu Java-Static ist in Kotlin jedes Companion Object ein vollwertiges Objekt, und auf Bytecode-Ebene werden Zugriffe auf seine Mitglieder als statisch kompiliert.
Companion genannt.class MyFactory private constructor(val value: Int) { companion object { fun create(x: Int): MyFactory = MyFactory(x) } } val instance = MyFactory.create(10)
Warum wird davon abgeraten, Zustand (zum Beispiel veränderbare Variablen) innerhalb eines
companion objectin multithreaded Anwendungen zu speichern?
Wenn veränderbarer Zustand innerhalb eines companion object platziert wird, wird er zwischen allen Instanzen der Klasse und Threads geteilt, was zu einer Race Condition ohne zusätzliche Synchronisation führt.
class Counter { companion object { var count = 0 fun increment() { count++ } } } Counter.increment() // Race Condition bei gleichzeitigen Aufrufen
Geschichte
Im Android-Projekt haben die Entwickler die Umgebungskonfiguration in ein
companion objectgelegt, um einen Debug-Schalter zu steuern. Dies führte zu Verwirrung, als verschiedene Fragmente denselben globalen Wert änderten, was unerwartetes Verhalten bei asynchronen Übergängen zur Folge hatte.
Geschichte
Im Backend wurde ein Teil der Funktionalität in ein
companion objectzusammen mit einem veränderbaren Cache gelegt. Bei hoher Last traten Fehler und inkonsistente Datenzustände aufgrund fehlender Synchronisation auf.
Geschichte
Ein unerfahrener Entwickler versuchte, das Interface nur im Companion Object zu implementieren, in der Annahme, dass er dann die Klasse wie dieses Interface verwenden könne. Infolgedessen stieß er auf die Unmöglichkeit, die Klasse anstelle des Companion Objects zu übergeben, da der Companion das einzige mit der Klasse verbundene Objekt ist, nicht die Klasse selbst.