UPD
В обновленных соглашениях о кодировании есть раздел по этой теме. :
Заводские функции
Если вы объявляете фабричную функцию для класса, не давайте ей то же имя, что и сам класс. Лучше использовать отдельное имя, чтобы было понятно, почему поведение фабричной функции особенное. Только если особой семантики действительно нет, можно использовать то же имя, что и у класса.
Пример:
class Point(val x: Double, val y: Double) {
companion object {
fun fromPolar(angle: Double, radius: Double) = Point(...)
}
}
Тем не менее, мотивация, которую я описал ниже, кажется, по-прежнему актуальна.
Как сказано в документации по стилю именования:
Если вы сомневаетесь, по умолчанию используйте соглашения о кодировании Java, такие как:
- методы и свойства начинаются с нижнего регистра
Одной из веских причин избегать имен функций, идентичных классу, является то, что это может запутать разработчика, который будет использовать его позже, потому что, вопреки их ожиданиям:
- функция не будет доступна для вызова суперконструктора (если класс
open
)
- он не будет виден как конструктор через отражение
- его нельзя использовать в качестве конструктора в коде Java (
new HashSet(n, it -> "Element " + it)
— ошибка)
- если вы захотите позже изменить реализацию и вместо этого вернуть некоторый экземпляр подкласса, будет еще более запутанно, что
HashSet(n) { "Element $it" }
создаст не HashSet
, а, например, LinkedHashSet
Лучше явно показать, что это фабричная функция, а не конструктор, чтобы избежать путаницы.
В stdlib также обычно избегают именования функции, аналогичной классу. Учитывая SomeClass
, в stdlib предпочтительным стилем именования для фабричных функций является someClassOf
, someClassBy
или что-то еще, что лучше всего объясняет семантику функции. Примеры:
generateSequence { ... }
и sequenceOf(...)
lazy { ... }
и lazyOf(...)
compareBy { ... }
listOf(...)
, setOf(...)
, mapOf(...)
Таким образом, у человека определенно должны быть веские причины для того, чтобы функция имитировала конструктор.
Вместо этого имя функции может рассказать пользователю больше (даже обо всем) о ее использовании.
person
hotkey
schedule
12.01.2016