Котлин рекомендовал отменить регистрацию слушателя с помощью SAM

Поэтому у меня есть интерактор, который выполняет операцию вставки с Realm, а затем уведомляет, что вставка завершена с помощью RealChangeListener. Это что-то вроде этого:

fun insertCar(item: Car) { realm.doInTransaction { val car = Car(...) val copy = copyToRealm(car) copy.addChangeListener(...) } } 

Я могу сделать это так:

 fun insertCar(item: Car, listener: RealmChangeListener<Car>) { realm.doInTransaction { val car = Car(...) val copy = copyToRealm(car) copy.addChangeListener(listener) } } 

И получить доступ вот так:

 realmInteractor.insertCar(item, RealmChangeListener { // do something here }) 

Но тогда у меня нет способа удалить этого слушателя

 realmInteractor.insertCar(item, RealmChangeListener { // do something here it.removeChangeListener(this) }) 

this укажет на класс, в котором он находится, а не фактический слушатель

Я также могу это сделать:

 fun insertCar(item: Car, doAfterChange (Car) -> Unit) { realm.doInTransaction { val car = Car(...) val copy = copyToRealm(car) copy.addChangeListener(RealmChangeListener{ doAfterChange() }) } } 

Но тогда у меня есть SAM внутри другого SAM (слишком overkill imo)

Я могу сделать это вот так:

 fun insertCar(item: Car, listener: RealmChangeListener<Car>) { realm.doInTransaction { val car = Car(...) val copy = copyToRealm(car) copy.addChangeListener(listener) } } realmInteractor.insertCar(item, object : RealmChangeListener<Car> { override fun onChange(element: Car?) { ... element?.removeChangeListener(this) } }) 

Это работает, но это слишком много.

Итак, как вы справляетесь с этим и что считается лучшим подходом?

Вы можете создать общий метод для выполнения прослушивателя с однократным запуском. Что-то вроде:

 fun <T> createInRealm(objectFactory: () -> T, changeListener: (T) -> Unit) { realm.doInTransaction { val obj = objectFactory() val copy = copyToRealm(obj) copy.addChangeListener(object : RealmChangeListener<T> { override fun onChange(element: T) { changeListener() element.removeChangeListener(this) } } } } 
Давайте будем гением компьютера.