我正在阅读《Kotlin in Action》一书,我问自己"使用构造函数引用创建类的实例"的目的是什么(如果有人感兴趣并且家里有这本书,第 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)
我认为它看起来像工厂方法调用,但我不认为这是此处方法引用的(唯一(目的。
以这种方式引用构造函数就像任何其他函数引用一样。它具有输入(参数(和返回值(类的新实例(。您可以将其传递给具有函数参数或某种工厂的高阶函数。
例如:
class MessageWrapper(val message: String)
val someStrings = listOf("Hello world")
您可以使用 lambda 将列表转换为具有这样的包装器类型:
val someMessages: List<MessageWrapper> = someStrings.map { MessageWrapper(it) }
但是,通过直接传递构造函数来跳过将函数包装在另一个函数中可能更清楚。
val someMessages: List<MessageWrapper> = someStrings.map(::MessageWrapper)
不过,函数和参数的清晰度改进比构造函数更明显。它还可以通过避免嵌套的 lambda 来帮助避免阴影it
。
对构造函数的引用是 Kotlin Reflection API 的一部分。您可以通过构造函数引用创建类的实例,即使该类甚至不在项目中(您从外部获取该引用(。反射被许多库和框架(例如 GSON(广泛使用,它们对代码一无所知,但仍然能够创建类的实例。