ProgrammierungBackend Entwickler

Was ist ein Companion Object in Kotlin, welche Besonderheiten und Einschränkungen hat es? Wie kann man Companion Objects zur Erstellung von Fabrikmethoden und statischen Zuständen verwenden?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

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.

Wesentliche Merkmale und Einschränkungen:

  • Standardname — wenn nicht ausdrücklich angegeben, wird das Objekt Companion genannt.
  • Das Companion Object kann beliebige Schnittstellen implementieren, weshalb es praktisch ist, beispielsweise um Fabrikmethoden zu erstellen.
  • Innerhalb des Companion Objects gibt es Zugriff auf private Mitglieder der äußeren Klasse.
  • In jeder Klasse kann es nur ein Companion Object geben.
  • Auf die Mitglieder des Companion Objects kann sowohl statisch über den Klassennamen als auch als Mitglieder des Objekts zugegriffen werden.

Beispiel:

class MyFactory private constructor(val value: Int) { companion object { fun create(x: Int): MyFactory = MyFactory(x) } } val instance = MyFactory.create(10)

Fangfrage.

Warum wird davon abgeraten, Zustand (zum Beispiel veränderbare Variablen) innerhalb eines companion object in multithreaded Anwendungen zu speichern?

Antwort mit Beispiel:

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

Beispiele für echte Fehler aufgrund fehlender Kenntnisse über die Feinheiten des Themas.


Geschichte

Im Android-Projekt haben die Entwickler die Umgebungskonfiguration in ein companion object gelegt, 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 object zusammen 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.