Какова цель ссылок на конструкторы в Котлине
Я читаю книгу Kotlin в действии и спрашиваю себя, какова цель "создания экземпляра класса с использованием ссылки на конструктор" (стр. 112, если кому-то интересно и книга есть дома).
Вот пример кода из книги:
data class Person(val name: String, val age: Int)
val createPerson = ::Person
val p = createPerson("Alice", 29)
println(p) // Person(name=Alice, age=29)
Я думаю, что это похоже на вызов фабричного метода, но я не думаю, что это (единственная) цель ссылки на метод здесь.
2 ответа
Конструктор, если на него ссылаются таким образом, аналогичен любой другой ссылке на функцию. У него есть входы (параметры) и возвращаемое значение (новый экземпляр класса). Вы можете передать его функции более высокого порядка, у которой есть параметр функции или какая-то фабрика.
Например:
class MessageWrapper(val message: String)
val someStrings = listOf("Hello world")
Вы можете преобразовать свой список в такой тип оболочки, используя лямбда:
val someMessages: List<MessageWrapper> = someStrings.map { MessageWrapper(it) }
но, возможно, проще пропустить перенос вашей функции в другую функцию, передав конструктор напрямую.
val someMessages: List<MessageWrapper> = someStrings.map(::MessageWrapper)
Однако улучшение ясности более очевидно с функциями и параметрами, чем с конструкторами. Это также может помочь избежать затененияit
s, избегая вложенных лямбд.
Ссылки на конструкторы являются частью Kotlin Reflection API. Вы можете создать экземпляр класса через ссылку на конструктор, даже если этого класса нет даже в вашем проекте (вы получаете эту ссылку извне). Отражение широко используется многими библиотеками и фреймворками (например, GSON), которые ничего не знают о вашем коде, но все же могут создавать экземпляры ваших классов.