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

时间:2018-01-13 12:13:52

标签: constructor kotlin

假设我有一个带有主构造函数的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)
}

1 个答案:

答案 0 :(得分:4)

Kotlin Language Specification对此有所说明(强调我的):

  

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

     

TODO