我试图了解使用/不使用@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();
}
所以我的问题是:
谢谢!
最佳答案
@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/