Какова цель ссылки на конструктор в Kotlin - PullRequest
0 голосов
/ 02 февраля 2020

Я читаю книгу 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 ]

2 голосов
/ 02 февраля 2020

Конструктор, на который ссылаются таким образом, похож на любую другую ссылку на функцию. Он имеет входные данные (параметры) и возвращаемое значение (новый экземпляр класса). Вы можете передать его в функцию более высокого порядка, которая имеет параметр функции или какую-то фабрику.

Например:

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, избегая вложенных лямбд.

1 голос
/ 02 февраля 2020

Ссылки на конструкторы являются частью Kotlin Reflection API. Вы можете создать экземпляр класса с помощью ссылки на конструктор, даже если этот класс отсутствует даже в вашем проекте (вы получаете эту ссылку извне). Reflection широко используется многими библиотеками и фреймворками (например, GSON), которые ничего не знают о вашем коде, но все же могут создавать экземпляры ваших классов.

...