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.
Companion genoemd.class MyFactory private constructor(val value: Int) { companion object { fun create(x: Int): MyFactory = MyFactory(x) } } val instance = MyFactory.create(10)
Waarom wordt niet aangeraden om status (zoals veranderlijke variabelen) binnen een
companion objectop te slaan in multi-threaded applicaties?
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
Verhaal
In een Android-project hebben ontwikkelaars de omgevingsconfiguratie in een
companion objectgeplaatst 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 objectgeplaatst, 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.