Il companion object (companion object) in Kotlin è un oggetto dichiarato all'interno di una classe con la parola chiave companion, che consente di raggruppare metodi e proprietà statiche, analogamente ai membri statici in Java. A differenza del static di Java, in Kotlin ogni companion object è un oggetto completo, e a livello di bytecode, l'accesso ai suoi membri è compilato come statico.
Companion.class MyFactory private constructor(val value: Int) { companion object { fun create(x: Int): MyFactory = MyFactory(x) } } val instance = MyFactory.create(10)
Perché non è consigliabile mantenere stato (ad esempio variabili mutabili) all'interno di un
companion objectnelle applicazioni multithread?
Se si colloca stato mutabile all'interno di un companion object, esso diventa condiviso tra tutte le istanze della classe e i thread, il che porta a una condizione di race senza sincronizzazione aggiuntiva.
class Counter { companion object { var count = 0 fun increment() { count++ } } } Counter.increment() // condizione di race durante chiamate simultanee
Storia
Nel progetto Android, gli sviluppatori hanno inserito la configurazione dell'ambiente all'interno di un
companion objectper gestire l'interruttore di debug. Questo ha portato a confusione quando diversi frammenti modificavano lo stesso valore globale, causando comportamenti inaspettati durante le transizioni asincrone.
Storia
Nel backend, parte della funzionalità è stata spostata in un
companion objectinsieme a una cache mutabile. Sotto carico elevato si sono verificati errori e stato inconsistente dei dati a causa della mancanza di sincronizzazione.
Storia
Un sviluppatore alle prime armi ha cercato di implementare l'interfaccia solo nel companion object, pensando di poter utilizzare la classe come quest'interfaccia. Di conseguenza, ha affrontato l'impossibilità di passare la classe invece del companion object, poiché il companion è l'unico oggetto associato alla classe, non la classe stessa.