“伴侣对象”的本意是什么?到目前为止,我一直在使用它来static在需要时替换 Java。
static
我很困惑:
companion object
:
companion object { val singleton by lazy { ... } }
这似乎是一种单一的方式。有什么更好的方法?
“伴侣对象”的本意是什么?为什么叫“伴侣”?
首先,Kotlin 没有使用 Java 的static成员概念,因为 Kotlin 有自己的s概念object来描述与单例状态相关的属性和函数,并且static类的 Java 部分可以优雅地表示为单例:它是一个单例对象可以通过类名来调用。因此命名:它是一个类附带的对象。
object
它的名字以前是class objectanddefault object,后来改名为companion objectwhich 更清晰,也与Scala 伴生对象一致。
class object
default object
除了命名之外,它比 Javastatic成员更强大:它可以扩展类和接口,并且您可以像其他对象一样引用和传递它。
这是否意味着要创建多个静态属性,我必须在companion object块内将它们组合在一起?
是的,这是惯用的方式。或者您甚至可以按它们的含义将它们分组到非伴随对象中:
class MyClass { object IO { fun makeSomethingWithIO() { /* ... */ } } object Factory { fun createSomething() { /* ... */ } } }
为了立即创建一个作用域为类的单例实例,我经常编写/*...*/这似乎是一种单一的做法。有什么更好的方法?
/*...*/
这取决于您在每种特定情况下需要什么。您的代码非常适合存储绑定到在第一次调用时初始化的类的状态。
如果您不需要它与类连接,只需使用对象声明:
object Foo { val something by lazy { ... } }