Kotlin recomienda la manera de anular el logging de un oyente con un SAM

Entonces tengo un interactor que realiza una operación de inserción con Realm y luego notifica que la inserción se completa con RealChangeListener. Es algo como esto:

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

Puedo hacerlo de esta manera:

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

Y acceda así:

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

Pero entonces no tengo forma de eliminar a este oyente

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

this apuntará a que la class está ubicada no es el oyente real

Yo también puedo hacer esto:

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

Pero luego tengo un SAM dentro de otro SAM (demasiado imo exagerado)

Puedo hacerlo así:

 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) } }) 

Lo cual funciona pero es demasiado detallado.

Entonces, ¿cómo lidiar con esto y cuál es considerado el mejor enfoque?

Puede crear un método genérico para realizar un escucha de ejecución única. Algo como:

 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) } } } }