java - 为什么以及何时将 @JvmStatic 与伴随对象一起使用?

我试图了解使用/不使用@JvmStatic 之间的区别,以及何时应该使用其中任何一个。

所以,使用 Kotlin 和 Java,我可以做到这一点:

TestKotlin.kt

class TestKotlin {
    companion object {
        val someString = "hello world"
    }
}

然后由 Java 调用,如下所示:

TestJava.java

public class TestJava {
    String kotlinStaticString = TestKotlin.Companion.getSomeString();
}

但是,有这个选项 2:

TestKotlin.kt v2

class TestKotlin {
    companion object {
        @JvmStatic  // <-- notice the @JvmStatic annotation
        val someString = "hello world"
    }
}

然后,从 Java 中调用它,如下所示:

TestJava.java v2

public class TestJava {
    String kotlinStaticString = TestKotlin.getSomeString();
}

所以我的问题是:

  • 这两种情况在行为或内存分配方面有什么不同吗?
  • 是否有偏好使用哪一个?
  • 是否都像 Java static 那样创建伪静态单例对象?

谢谢!

最佳答案

@JvmStatic 注解的行为在the documentation 中有详细解释。 .阅读文档时,您应该假设它为您提供了所有重要信息,并且不存在文档中未提及的行为差异。

在这种情况下,文档说:

If you use this annotation, the compiler will generate both a static method in the enclosing class of the object and an instance method in the object itself.

换句话说,注解的作用是告诉编译器生成一个额外的方法

文档是否提到行为或内存分配有任何差异?它不是。因此,可以肯定地认为没有。

对使用哪一个有偏好吗?通常,一个 API 在一个地方声明并在多个地方使用。如果你从 Java 调用一个方法,那么你应该将它声明为 @JvmStatic,因为在一个地方添加 @JvmStatic 注释可以让你省略多个 .Companion 多处引用。

两者都创建一个伪静态单例对象,就像 Java 的静态一样吗?这个问题没有意义,因为 Java static 不会创建“伪静态单例对象”。如果在 Java 类中声明一个静态方法,然后调用该方法,则不会创建任何对象。

https://stackoverflow.com/questions/48780003/

相关文章:

gradle - 使用Gradle Kotlin DSL在Gradle中进行样板项目配置

kotlin - 如何获取给定密封类的所有子类?

kotlin - 如何组织 Kotlin 扩展方法

android - Kotlin:const val 与 val

kotlin - 如何使用 toString 扩展数据类

java - Kotlin 中的私有(private)构造函数

parallel-processing - Kotlin 集合的并行操作?

java - Kotlin 泛型 Array 结果为 "Cannot use T as a r

android - 在库模块中使用 Kotlin,而不在 app 模块中使用它

list - Kotlin - 创建具有重复元素的可变列表