首页 文章

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

提问于
浏览
16

companion objects的文档包含以下示例

class MyClass {
    companion object Factory {
        fun create(): MyClass = MyClass()
    }
}

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

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

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

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

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

3 回答

  • 0

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

    MyClass.create()           // not via companion name
    MyClass.Companion.create() // via default companion name
    MyClass.Factory.create()   // via companion name
    

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

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

    MyClass.Factory.create();   // with named companion
        MyClass.Companion.create(); // with unnamed comanion
    
  • 8

    如果您不使用显式名称,则同伴名称为 Companion ,因此可以省略,就像您已经引用的那样 .

    有时您可能希望在通话中使用明确的名称,在您的示例中为 MyClass.Factory.create() . 出于名称空间原因可能

    我也没有看到很多原因 to name a companion 对象 . 除非您关心使用Kotlin代码的Java互操作 . 然后,您需要显式写入随播广告名称 .

    您可能关心名称的另一个原因是,当您在其上定义 extension function 时:

    fun MyClass.Companion.ext() = "myext"
    

    在这种情况下,当它具有像 Factory 这样的名称时可以更清楚,在该名称上通过扩展名添加了特定的工厂方法 .

  • 2

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

    class Person(val name: String) { companion object Loader {
    fun fromJSON(jsonText: String): Person = ... }
    }
    >>> person = Person.Loader.fromJSON("{name: 'Dmitry'}") >>> person.name
    Dmitry
    >>> person2 = Person.fromJSON("{name: 'Brent'}") >>> person2.name
    Brent
    

相关问题