伴随对象(companion object)在Kotlin中是一个在类内部声明的对象,使用关键字companion,允许将静态方法和属性进行分组,类似于Java中的静态成员。与Java的静态成员不同,在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中保存状态(例如可变变量)?
如果将可变状态放在companion object内部,它将在所有类的实例和线程之间共享,这可能导致竞争条件,除非进行额外的同步。
class Counter { companion object { var count = 0 fun increment() { count++ } } } Counter.increment() // 多次调用时的竞争条件
故事
在一个Android项目中,开发人员将环境配置放在
companion object内部,以控制调试开关。这导致混乱,因为不同的片段更改了相同的全局值,导致在异步切换时出现意外行为。
故事
在后端,部分功能被放入
companion object中,并带有可变缓存。在高负荷下,由于缺乏同步,出现了错误和数据不一致状态。
故事
一个初学者开发者试图只在伴随对象上实现接口,以为之后可以将类用作该接口。结果,他遇到了无法将类传递给伴随对象的情况,因为伴随对象是与类相关的唯一对象,而不是类本身。