gpt4 book ai didi

kotlin - 我应该使用 Object 还是文件级 val 创建单例?

转载 作者:行者123 更新时间:2023-12-04 15:08:04 24 4
gpt4 key购买 nike

我们想要一个将在我们的代码库中使用的类的单个实例。我们创建了一个专用包来保存这个实例。如果我没理解错的话,有两种方法可以声明单例。

(这些示例使用了 Jackson,但这并不以任何方式特定于它。)

对象

package net.goout.jackson

import com.fasterxml.jackson.databind.ObjectMapper
...

object Jackson : ObjectMapper() {
init {
configure(...)
}
}

文件级val

package net.goout.jackson

import com.fasterxml.jackson.databind.ObjectMapper
...

val jackson = ObjectMapper().apply {
configure(...)
}

在这两种情况下,只会创建一个实例,并且调用站点相同(除了命名上的细微差别)。

这两种方法之间有什么实际区别吗?

最佳答案

我无法发现任何实际差异,不!

查看生成的字节码表明这两种情况比您想象的更相似:都有一个静态初始化程序和一个字段。主要区别在于,在 object 情况下,它们位于新类中并且字段 (INSTANCE) 是公共(public)的,而在 var 情况下它是私有(private)的,可以通过名为 …Kt 的隐藏类中的 getter 方法访问。 (在实践中, setter/getter 通常会被优化掉。)这可能会影响初始化顺序,但在这里无关紧要。

在语言层面,object 版本会创建一个新的子类,而 val 版本不会——所以你可能会认为后者稍微“更纯粹” ',虽然我看不出这对你有什么影响。如果您从 Java 调用,这两种情况会有不同的复杂性——尽管问题只提到了 Kotlin。

val 版本更短更简单——只是一个很小的优势,但在没有任何其他因素的情况下,简洁和简单是好事!

顺便说一下,这个问题假定 configure() 方法是“流畅的”,即返回调用它的对象。但即使没有,您也可以通过简单地将它包围在 apply() 调用中来获得相同的效果。

关于kotlin - 我应该使用 Object 还是文件级 val 创建单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65721381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com