Какова точка назначения сопутствующего объекта в котлин

Документация для сопутствующих объектов приведена в следующем примере.

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 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() в вашем примере. Возможно, для пространства имен.

Я не вижу много причин, чтобы назвать сопутствующий объект. Кроме того, если вам интересно, что Java взаимодействует с вашим кодом Kotlin. Затем вам нужно явно написать имя компаньона.

Еще одна причина, по которой вам может быть интересно имя, заключается в определении функции расширения на нем:

  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