构造函数中的调用顺序是有保证的

假设我有一个具有主构造函数的Kotlin(data)类和一个用调用某些方法来填充主构造函数的val / vars的辅助函数(请参阅示例)。 我的问题是这些方法被调用的顺序是否有保证,即在我的例子中是否在extractNames之前总是会调用checkConsitency

 data class LawAndOrder(val sherifs: Int, val names: List) { constructor(westerners: List) : this(sherifs = westerners.checkConsistency(), names = westerners.extractNames()) } data class Westerner(val name: String) { val isCriminal: Boolean get() = name == "Jesse James" } private fun List.checkConsistency(): Int { println("Checking consistency") if (isEmpty()) throw IllegalArgumentException("Crime and chaos") if (any { it.isCriminal }) throw IllegalArgumentException("Inadmissible") return size } private fun List.extractNames(): List { println("Extracting names") return map { it.name } } fun main(args: Array) { val westerners = listOf(Westerner("John Wayne"), Westerner("Limonádový Joe")) val lawAndOrder = LawAndOrder(westerners) println(lawAndOrder) } 

Kotlin语言规范有这个说法(重点是我的):

16.39。 评估顺序一般来说,评估的顺序是从左到右,非懒惰(渴望)。 有些expression式对组成部分的评估顺序有特殊的规则(有些可能根本就没有评估)。 命名参数的评估顺序对应于它们在调用站点上的顺序,而不是声明站点。

去做