Kotlin: «synchronized» заставляет компилятор не быть уверенным в инициализации переменной

Представьте себе следующий фрагмент кода Kotlin, который выполняет некоторый запрос к базе данных с помощью JDBC-коннектора:

var results : ResultSet preparedStatement.clearParameters() preparedStatement.setInt(1,value1); preparedStatement.setInt(2,value2) results = preparedStatement.executeQuery() while(results.next()) { // parse results } 

который компилируется без проблем. Однако, когда я пытаюсь добавить безопасность потоков к доступу к readyStatement:

  var results : ResultSet synchronized(preparedStatement) { preparedStatement.clearParameters() preparedStatement.setInt(1,value1); preparedStatement.setInt(2,value2) results = preparedStatement.executeQuery() } while(results.next()) { // parse results } 

… Я получил «переменные» результаты, которые должны быть инициализированы » . Кажется, synchronized блок действует как условный блок, но вы можете быть уверены, что он будет выполнен один раз, до блока while .

Я реализовал этот же блок в Java, и я не получаю ошибку. Является ли это ошибкой дизайна / реализации Kotlin? Или у этого есть веская причина вести себя так?

synchronized – это просто встроенная функция, и компилятор не знает, будет ли lambda выполняться один раз или даже выполнить вообще. Идиоматический способ – вернуть значение из лямбда и назначить его локальному:

 val results = synchronized(preparedStatement) { preparedStatement.clearParameters() preparedStatement.setInt(1,value1); preparedStatement.setInt(2,value2) preparedStatement.executeQuery() } 
Intereting Posts
Класс Android не найден Intermitten и распространяется через код Наблюдаемое свойство, позволяющее добавлять наблюдателей во время выполнения Отображать информацию о состоянии в список участников динамически Как я могу использовать базу данных пользовательского интерфейса Firebase с Kotlin Android – Сделать функцию ложной / не запускать Плагин kapt не работает с gradle-script-kotlin Android – Как изменить цвет рисования пользовательского вида? перегрузка + и + = операторов для «классов номеров» В Котлин я могу создать диапазон, который учитывается в обратном направлении? Kotlin: Невозможно импортировать по требованию из объекта Kotlin + Кинжал – введите карту для фабрики ViewModel Как использовать выражение Lamba, чтобы сделать вызовы метода Java менее подробными в Kotlin? Как прочитать ряд элементов под дочерним узлом в Firebase с использованием FirebaseAdapter Android: Как вызвать функцию ndk из Kotlin? Обновление Kotlin от 1.0.2 до 1.0.3: java.lang.NoSuchMethodError: виртуальный метод не предоставленInjectedData $ app_compileDebugKotlin ()