ProgrammatieBackend ontwikkelaar

Wat is een companion object in Kotlin, wat zijn de kenmerken en beperkingen? Hoe kun je companion objects gebruiken om fabrieksmethoden en statische status te creëren?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Een companion object (companion object) in Kotlin is een object dat binnen een klasse is gedeclareerd met het sleutelwoord companion, en dat het mogelijk maakt om statische methoden en eigenschappen te groeperen, vergelijkbaar met statische leden in Java. In tegenstelling tot Java static, is elk companion object in Kotlin een volwaardig object, en op bytecode-niveau worden de verwijzingen naar zijn leden gecompileerd als statische.

Belangrijkste kenmerken en beperkingen:

  • Standaardnaam — als deze niet expliciet is opgegeven, wordt het object Companion genoemd.
  • Een companion object kan elke interface implementeren, waardoor het handig is voor het maken van fabrieksmethoden.
  • Binnen een companion object hebben we toegang tot de privéleden van de externe klasse.
  • In elke klasse kan er slechts één companion object zijn.
  • We kunnen naar de leden van het companion object verwijzen als naar statische leden via de naam van de klasse, of als leden van het object.

Voorbeeld:

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

De vraag met een valstrik.

Waarom wordt niet aangeraden om status (zoals veranderlijke variabelen) binnen een companion object op te slaan in multi-threaded applicaties?

Antwoord met voorbeeld:

Als je veranderlijke status binnen een companion object plaatst, wordt deze gedeeld tussen alle instanties van de klasse en threads, wat leidt tot een race condition zonder aanvullende synchronisatie.

class Counter { companion object { var count = 0 fun increment() { count++ } } } Counter.increment() // race condition bij gelijktijdige aanroepen

Voorbeelden van echte fouten door gebrek aan kennis van de subtiliteiten van het onderwerp.


Verhaal

In een Android-project hebben ontwikkelaars de omgevingsconfiguratie in een companion object geplaatst om de debug-schakelaar te beheren. Dit leidde tot verwarring, omdat verschillende fragmenten dezelfde globale waarde wijzigden, wat onverwacht gedrag veroorzaakte tijdens asynchrone overgangen.


Verhaal

Aan de backend is een deel van de functionaliteit in een companion object geplaatst, samen met een veranderlijke cache. Bij hoge belasting traden fouten en inconsistente datastatus op door gebrek aan synchronisatie.


Verhaal

Een beginnende ontwikkelaar probeerde de interface alleen in het companion object te implementeren, in de veronderstelling dat hij de klasse daarna als die interface zou kunnen gebruiken. Als gevolg hiervan kwam hij erachter dat hij de klasse niet kon doorgeven in plaats van het companion object, omdat het companion object de enige object is die aan de klasse is gekoppeld, en niet de klasse zelf.