假设我有一个带有主构造函数的Kotlin(数据)类和一个通过调用某些方法填充主要构造函数的vals / vars的辅助类(参见示例)。我的问题是这些方法被调用的顺序是否得到保证,即我的示例checkConsitency
是否总是在extractNames
之前被调用。
data class LawAndOrder(val sherifs: Int, val names: List<String>) {
constructor(westerners: List<Westerner>) :
this(sherifs = westerners.checkConsistency(),
names = westerners.extractNames())
}
data class Westerner(val name: String) {
val isCriminal: Boolean
get() = name == "Jesse James"
}
private fun List<Westerner>.checkConsistency(): Int {
println("Checking consistency")
if (isEmpty()) throw IllegalArgumentException("Crime and chaos")
if (any { it.isCriminal }) throw IllegalArgumentException("Inadmissible")
return size
}
private fun List<Westerner>.extractNames(): List<String> {
println("Extracting names")
return map { it.name }
}
fun main(args: Array<String>) {
val westerners = listOf(Westerner("John Wayne"), Westerner("Limonádový Joe"))
val lawAndOrder = LawAndOrder(westerners)
println(lawAndOrder)
}
答案 0 :(得分:4)
Kotlin Language Specification对此有所说明(强调我的):
16.39。评估顺序 通常,评估顺序是从左到右,非懒惰(渴望)。有些表达式对其组成部分的评估顺序有特殊规则(其中一些可能根本没有评估)。 命名参数的评估顺序对应于它们在调用站点的顺序,而不是声明站点。
TODO