Intereting Posts
Как справляться с общими границами, переносящимися с Java на Kotlin? Kotlin: Как я могу использовать отражение в пакетах? что эквивалентно этому java-коду kotlin Location имеет значение null, если GoogleMap не инициализируется снова JAX-RS с Kotlin MessageBodyWriter не найден Лучшая практика для преобразования java-кода, используемого для копирования файлов с файлами в кеш-папку в Android на Kotlin Как эмулировать такое же поведение в котлине Firebase Android – создайте пользователя с помощью электронной почты и пароль в Kotlin Не удалось загрузить ошибку класса kotlin.collections.CollectionsKT при попытке синхронизации градиента Android DataBinding: @BindingAdapter в Kotlin не распознает lambdas Получение ошибки «Несовместимые типы» при использовании кода, сгенерированного из класса данных Kotlin Не удается открыть проект студии Android после установки kotlin Тип функции Kotlin вместо функционального интерфейса лямбда Spring Data JPA / Hibernate "Невозможно найти атрибут с заданным именем" Kotlin Либо монада: рефакторинг вызова конструктора для обработки CPS

Гарантирован порядок вызовов внутри конструктора

Предположим, что у меня есть класс Kotlin (data) с основным конструктором и вторичный, который заполняет vals / vars первичного с вызовом некоторых методов (см. Пример). Мой вопрос заключается в том, гарантирован ли порядок, в котором эти методы вызываются, т. checkConsitency Будет ли в моем примере 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) } 

Спецификация Kotlin Language имеет это, чтобы сказать об этом (внимание мое):

16,39. Порядок оценки Как правило, порядок оценки оставлен вправо, не ленивый (нетерпеливый). Некоторые выражения имеют специальные правила для порядка оценки их составных частей (некоторые из них могут вообще не оцениваться). Порядок оценки именованных аргументов соответствует их порядку на сайте вызова, а не на сайте объявления.

ДЕЛАТЬ