Kotlinにおけるコンパニオンオブジェクト(companion object)は、companionキーワードを使用してクラス内に宣言されたオブジェクトであり、Javaの静的メンバーに似た静的メソッドやプロパティをグループ化することを可能にします。Javaのstaticとは異なり、Kotlinの各コンパニオンオブジェクトは完全なオブジェクトであり、バイトコードレベルでは、そのメンバーへのアクセスが静的にコンパイルされます。
Companionと呼ばれます。class MyFactory private constructor(val value: Int) { companion object { fun create(x: Int): MyFactory = MyFactory(x) } } val instance = MyFactory.create(10)
なぜ、マルチスレッドアプリケーションにおいて
companion object内に状態(例えば、可変変数)を保存することが推奨されないのですか?
可変状態をコンパニオンオブジェクト内に置くと、それはクラスの全インスタンスとスレッド間で共有されるため、追加の同期なしにレースコンディションを引き起こす可能性があります。
class Counter { companion object { var count = 0 fun increment() { count++ } } } Counter.increment() // 同時呼び出し時のレースコンディション
歴史
Androidプロジェクトで、開発者たちはデバッグスイッチを管理するために環境設定を
companion object内にまとめました。これにより、異なるフラグメントが同じグローバル値を変更し、非同期遷移時に予期しない動作が発生しました。
歴史
バックエンドで、一部の機能が可変キャッシュと共に
companion objectに移行されました。高負荷時にエラーが発生し、同期の欠如によりデータの不整合状態が生じました。
歴史
初心者開発者は、コンパニオンオブジェクトのみにインターフェースを実装しようとし、その後クラスをそのインターフェースとして使用できると考えていました。その結果、コンパニオンはクラスに関連付けられた唯一のオブジェクトであり、クラス自体ではないため、クラスをコンパニオンオブジェクトとして渡すことができないという問題に直面しました。