我试图了解使用/不使用 @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 一样吗?
谢谢!
原文由 TooManyEduardos 发布,翻译遵循 CC BY-SA 4.0 许可协议
@JvmStatic
注释的行为在 文档 中有详细解释。阅读文档时,您应该假设它为您提供了所有重要信息,并且不存在文档中未提及的行为差异。在这种情况下,文档说:
换句话说,注解的作用是告诉编译器 _生成一个额外的方法_。
文档是否提到行为或内存分配有任何差异?它不是。因此,可以安全地假设没有。
对使用哪一个有偏好吗?通常,API 在一个地方声明并从多个地方使用。如果您从 Java 调用方法,那么您应该将其声明为
@JvmStatic
,因为在一个地方添加@JvmStatic
注释将允许您省略多个.Companion
多处引用。两者都创建一个伪静态单例对象,就像 Java static 一样吗?这个问题没有意义,因为Java static 不会创建“伪静态单例对象”。如果在 Java 类中声明一个静态方法,然后调用这个方法,则不会创建任何对象。