小编典典

为什么我们使用“伴侣对象”作为 Kotlin 中 Java 静态字段的一种替代?

all

“伴侣对象”的本意是什么?到目前为止,我一直在使用它来static在需要时替换 Java。

我很困惑:

  • 为什么叫“伴侣”?
  • 这是否意味着要创建多个 静态 属性,我必须在块内将它们组合在一起companion object
  • 为了立即创建一个作用域为类的单例实例,我经常写

companion object {
    val singleton by lazy { ... }
}

这似乎是一种单一的方式。有什么更好的方法?


阅读 59

收藏
2022-08-08

共1个答案

小编典典

  • “伴侣对象”的本意是什么?为什么叫“伴侣”?

首先,Kotlin 没有使用 Java 的static成员概念,因为 Kotlin
有自己的s概念object来描述与单例状态相关的属性和函数,并且static类的 Java
部分可以优雅地表示为单例:它是一个单例对象可以通过类名来调用。因此命名:它是一个类附带的对象。

它的名字以前是class objectanddefault object,后来改名为companion objectwhich 更清晰,也与Scala 伴生对象一致。

除了命名之外,它比 Javastatic成员更强大:它可以扩展类和接口,并且您可以像其他对象一样引用和传递它。

  • 这是否意味着要创建多个静态属性,我必须在companion object块内将它们组合在一起?

是的,这是惯用的方式。或者您甚至可以按它们的含义将它们分组到非伴随对象中:

    class MyClass {
    object IO {
        fun makeSomethingWithIO() { /* ... */ }
    }

    object Factory {
        fun createSomething() { /* ... */ }
    }
}
  • 为了立即创建一个作用域为类的单例实例,我经常编写/*...*/这似乎是一种单一的做法。有什么更好的方法?

这取决于您在每种特定情况下需要什么。您的代码非常适合存储绑定到在第一次调用时初始化的类的状态。

如果您不需要它与类连接,只需使用对象声明:

    object Foo {
    val something by lazy { ... }
}
2022-08-08