我正在研究gigasecond
Kotlin
的{{1}}锻炼练习的解决方案:http://exercism.io/exercises/kotlin/gigasecond/readme。我可以理解它是如何需要两个构造函数的,因为在创建类时会传入LocalDate
和LocalDateTime
个参数。我不明白的是下面的二级类构造变量是如何在类中传入和使用的。似乎只有在传入LocalDateTime
个参数时才会进行计算,因为只能使用dobWithTime
进行计算。这里发生了什么魔力?
data class Gigasecond(val dobWithTime: LocalDateTime) {
constructor(dateOfBirth: LocalDate) : this(dateOfBirth.atStartOfDay())
val date: LocalDateTime = dobWithTime.plusSeconds(1000000000)
}
答案 0 :(得分:5)
辅助构造函数只是使用: this()
语法将调用转发给主构造函数,同时从它收到的LocalDateTime
创建所需的LocalDate
对象作为参数。
您可以将辅助构造函数视为执行以下操作的函数:
fun createGigaSecond(dateOfBirth: LocalDate): Gigasecond {
return Gigasecond(dateOfBirth.atStartOfDay())
}
除非它使用通常的构造函数语法,因此可以将其称为Gigasecond(dataOfBirth)
而不是createGigaSecond(dateOfBirth)
。
关于secondary constructors的官方文档:
如果类具有主构造函数,则每个辅助构造函数需要直接或间接通过另一个辅助构造函数委托给主构造函数。使用
this
关键字完成对同一个类的另一个构造函数的委派。
这就是这里发生的事情。