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