Intereting Posts
почему назначения не являются заявлениями Kotlin Kmongo вставить и вернуть вставленный элемент try-with-resources: функция «использовать» в Kotlin не всегда работает Как исправить потерянное время на дату после преобразования? Как изменить цвет фона карты, когда он выбран? Параметр эффективный конфликт видимости между java и kotlin Как использовать AndroidAnnotation @SharedPref с Kotlin Заменить java-общий интерфейс в Kotlin для привязки данных Класс Kotlin работает как тесты junit, даже если он находится в пакете androidTest – для класса Java он работает нормально retryWhen () не вызывает то, что находится внутри Observable.just () Разница между тем и запуском в Котлине Как сделать класс данных в Kotlin неизменным с java Date объектом в нем? Есть ли у котлин-родных деструкторы? Ошибка в findViewById после обновления для компиляции версии sdk Возможно ли распространять список внутри списка в Котлине?

Зачем нужен код B для использования SQLiteDatabase. () В параметре ввода?

Код А хорош, чтобы сделать это просто, кто-то написал код Б.

Я не могу понять, почему параметр shoud (transactionFun:SQLiteDatabase.()->Unit) в коде B

Я думаю (transactionFun: ()->Unit) в коде B тоже хороша, правильно?

Код А

 fun excuteTransaction(transactionFun:()->Unit){ val db = dbHelper.writableDatabase try{ db.beginTransaction() transactionFun() db.setTransactionSuccessful() }finally { db.endTransaction() } } 

Код B

 fun SQLiteDatabase.executeTransaction(transactionFun:SQLiteDatabase.()->Unit){ try{ beginTransaction() transactionFun() setTransactionSuccessful() }finally { endTransaction() } } 

Код A хорош, но чтобы получить доступ к вашему dbHelper вы должны объявить переменную и отправить ее на лямбда. Код B лучше, потому что у вас есть доступ к dbHelper без переменной, потому что это функция расширения. Я думаю, что это выглядит лучше. Например, код вызова A выглядит

 fun callCodeA() { excuteTransaction { dbHelper.execSQL("sone query") } } 

код вызова B выглядит так:

 fun callCodeB() { dbHelper.executeTransaction { execSQL("sone query") } } 

Что касается SQLiteDatabase.() -> Unit . Он должен избегать переменных и получать доступ к this . Внутри лямбда у вас нет доступа к экземпляру текущего объекта. Самый простой способ добиться этого – отправить текущий объект на лямбда. Например, вы можете сделать

 fun SQLiteDatabase.executeTransaction(transactionFun: (SQLiteDatabase) -> Unit){ try{ beginTransaction() transactionFun(this) setTransactionSuccessful() }finally { endTransaction() } } 

но с помощью функций расширения с лямбдами это выглядит лучше.