当前位置: 首页 > 面试题库 >

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

隗俊誉
2023-03-14
问题内容

我试图了解使用/不使用@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注释的行为在文档中进行了详细说明。阅读文档时,应假定它为您提供了所有重要信息,并且不存在文档中未提及的行为差异。

在这种情况下,文档说:

如果使用此批注,则编译器将在对象的封闭类中生成静态方法,并在对象本身中生成实例方法。

换句话说,注释的作用是告诉编译器 生成其他方法

文档中是否提到行为或内存分配有任何差异?它不是。因此,可以安全地假设没有。

是否有偏好使用哪一个?通常,API在一个地方声明并在多个地方使用。如果从Java调用方法,则应将其声明为@JvmStatic,因为@JvmStatic在一个地方添加注释将使您可以.Companion在多个地方省略多个引用。

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



 类似资料:
  • 问题内容: 抱歉,如果我有点模棱两可,但是我试图了解使用Node.js而不是其他服务器端语言的真正优势。 我是JavaScript爱好者,所以我可能会玩Node.js,但我想知道是否应该在项目中使用它。 问题答案: 在V8上发生了异步非阻塞I / O 构建。 因此,我们拥有了Google JavaScript解释器V8的所有性能提升。由于JavaScript性能竞赛尚未结束,您可以期望Google

  • 问题内容: 令我惊讶的是,StackOverflow上没有人问过这个问题。 通过JSON对象文档和快速的Google搜索无法获得令人满意的结果。 有什么好处?它是如何工作的? 编辑:为了清楚起见,请看一下这个展平/未展平的示例。 谢谢。 问题答案: 在许多情况下,您会获得由某些库自动构建的JSON文本。在整个编程语言中,有许多库构建JSON文本(此处是一个示例 每当库添加一些其他对象或数组包装时,

  • 问题内容: 在我的应用程序中,我需要通过ajax发布将javascript Array对象发送到php脚本。像这样: 数组的索引是字符串,而不是int,因此,诸如saveData.join(’&’)之类的东西不起作用。 有想法吗? 提前致谢 问题答案: 如果不是数组,则不要使其成为数组,而应将其作为对象: 以与Arrays相同的方式进行操作只是利用Javascript对Arrays的处理方式,而不

  • 我试图了解GraphQL最适合在微服务架构中使用的地方。 关于只有一个GraphQL模式作为API网关,将请求代理给目标微服务并强制它们的响应,存在一些争论。微服务仍然会使用REST/Trift协议进行通信。 另一种方法是拥有多个GraphQL模式,每个微服务一个。有一个较小的API网关服务器,它将请求路由到目标微服务,并带有请求的所有信息+GraphQL查询。 第一种方法 将1个GraphQL模

  • 问题内容: 为什么在生成输出时不能与DomDocument对象一起使用? 问题答案: 更新: 从PHP 5.4.1开始,您最终可以使用DOM对象。参见https://gist.github.com/2499678 这是一个错误: http://bugs.php.net/bug.php?id=48527

  • Kotlin代码是这样的: 可以简单地更改为 我知道同伴对象可以用来作为真正的java静态函数使用,但是使用同伴对象还有其他的优点吗?