在kotlin中命名伴侣对象有什么意义

Mic*_*son 17 kotlin kotlin-companion

随播对象的文档具有以下示例

class MyClass {
    companion object Factory {
        fun create(): MyClass = MyClass()
    }
}
Run Code Online (Sandbox Code Playgroud)

Factory是伴随对象的名称.然后继续说:

可以省略伴随对象的名称,在这种情况下Companion将使用名称:

但是,我没有看到使用伴随对象名称的示例.

因为每个类只能有一个伴侣对象(否则你会收到Only one companion object is allowed per class错误),这个名字对我来说就像是一些非常无用的语法糖.

同伴对象的名称实际上可以用于什么?为什么有人会为此使用任何名称呢?

gue*_*ter 8

您可以使用随播广告的名称:

MyClass.create()           // not via companion name
MyClass.Companion.create() // via default companion name
MyClass.Factory.create()   // via companion name
Run Code Online (Sandbox Code Playgroud)

这个名字对于Kotlin来说可能并不重要,因为你可以在不知道有伴随对象的情况下访问该方法(上面的第一行).如果你想更明确地访问这些功能,它更像是一种个人风格.

但是对于java interop,它会有所不同,因为你必须通过配套名称访问该函数:

    MyClass.Factory.create();   // with named companion
    MyClass.Companion.create(); // with unnamed comanion
Run Code Online (Sandbox Code Playgroud)


Har*_*edi 5

那么,Kotlin 中的伴生对象不仅仅是语法糖。他们其实是一个类型。它们能够做更多的事情,并且不必被视为只是静态的替代品。

您实际上可以扩展类或实现接口。请参阅下面的示例。

open class Super {
    open fun sayHello() {
        println("Hello")
    }
}

class Some {
    companion object Child : Super() {
        override fun sayHello() {
            super.sayHello()
            println("Hello from companion object")
        }
    }
}

fun main() {
    Some.Child.sayHello()
}
Run Code Online (Sandbox Code Playgroud)