Kotlin推荐使用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(太过分了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) } } } } 
Interesting Posts