companion object {
@JvmStatic
val instance: AppSettingsState
get() = ApplicationManager.getApplication().getService(AppSettingsState::class.java)
val acceptedCompletionCounter = AtomicInteger(0)
}
@JvmStatic 注解的作用是:-- 兼容 java 中的静态成员
主要功能
- 生成静态方法:使 Kotlin 的 companion object 中的属性或方法在编译后的字节码中表现为真正的 Java 静态成员
- Java 互操作性:让 Java 代码能够像调用普通静态方法一样调用这些成员,而不需要通过 companion object 引用
这里的 @JvmStatic 注解使得 [instance] 属性的 getter 方法在编译后成为真正的静态方法,这样:
- Kotlin 中调用:[AppSettingsState.instance]
- Java 中调用:
AppSettingsState.getInstance()(而不是AppSettingsState.Companion.getInstance())
优势
- 提供更自然的 API 调用方式
- 保持与现有 Java 代码的兼容性
- 避免了 Kotlin 特有的 companion object 概念对 Java 开发者的困扰
使用 companion object 不加 @JvmStatic 也是可以的,但有一些重要区别:
不使用 @JvmStatic 的情况
- Kotlin 内部访问:完全正常工作
- Java 调用方式:需要通过
Companion对象访问
// Kotlin 中调用(两种方式都可以)
val settings = AppSettingsState.instance
val settings = AppSettingsState.Companion.instance
// Java 中调用(不使用 @JvmStatic)
AppSettingsState.Companion.getInstance();
使用 @JvmStatic 的优势
-
Java 兼容性更好:
// 使用 @JvmStatic 后,Java 中可以直接这样调用 AppSettingsState instance = AppSettingsState.getInstance(); -
API 更简洁:
- 避免了
Companion这个 Kotlin 特有概念 - 对 Java 开发者更友好
- 避免了
-
性能略微提升:
- 生成真正的静态方法而非实例方法
总结
虽然不加 @JvmStatic 也能正常工作,但在 IntelliJ 插件开发这种需要与 Java 代码频繁交互的场景中,添加 @JvmStatic 是一种更好的实践,能提供更好的互操作性和更简洁的 API