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

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

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

这里Factory是伴侣对象的名字 。 然后它继续说:

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

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

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

伴侣对象的名字实际上可以用来做什么? 为什么会打扰使用任何名称?

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

 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 

如果您不使用明确的名称,则随播广告的名称为Companion ,因此可以省略,就像您已经引用过的一样。

有时你可能想在你的调用中有一个明确的名字,在你的例子中,这将是MyClass.Factory.create() 。 对于命名空间的原因也许。

我也没有看到有很多理由要命名同伴对象。 除非您关心与您的Kotlin代码的Java互操作。 然后,您需要明确写出随播广告的名称。

你可能会关心这个名字的另一个原因是,当你定义一个扩展函数时:

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

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

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

 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