kotlin 中 @JvmStatic 注解

32 阅读1分钟
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 方法在编译后成为真正的静态方法,这样:

  1. Kotlin 中调用:[AppSettingsState.instance]
  2. 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 的优势

  1. Java 兼容性更好

    // 使用 @JvmStatic 后,Java 中可以直接这样调用
    AppSettingsState instance = AppSettingsState.getInstance();
    
  2. API 更简洁

    • 避免了 Companion 这个 Kotlin 特有概念
    • 对 Java 开发者更友好
  3. 性能略微提升

    • 生成真正的静态方法而非实例方法

总结

虽然不加 @JvmStatic 也能正常工作,但在 IntelliJ 插件开发这种需要与 Java 代码频繁交互的场景中,添加 @JvmStatic 是一种更好的实践,能提供更好的互操作性和更简洁的 API