可在地图上观察以检测何时添加、更新或删除条目
Observable on map to detect when is added, updated of deleted an entry
我有一张地图,在我的例子中是 ConcurrentHashMap<String, Device>
,当在 websocket 上接收到一些事件时它正在更新。我想在此地图上实现一个可观察对象,以了解何时添加、更新或删除条目。我尝试使用 ObservableProperty
但在更改地图时没有调用任何方法。
var deviceCache : ConcurrentHashMap<String, Device> by MyObservable(ConcurrentHashMap())
class MyObservable<T, V>(initialValue: ConcurrentHashMap<T, V>) : ObservableProperty<ConcurrentHashMap<T, V>>(initialValue) {
override fun afterChange(property: KProperty<*>, oldValue: ConcurrentHashMap<T, V>, newValue: ConcurrentHashMap<T, V>) {
super.afterChange(property, oldValue, newValue)
log.e("new value is $newValue")
}
override fun beforeChange(property: KProperty<*>, oldValue: ConcurrentHashMap<T, V>, newValue: ConcurrentHashMap<T, V>): Boolean {
log.e("beforeChange called")
return super.beforeChange(property, oldValue, newValue)
}
}
谁能帮我解决这个问题?
问题是 Map
不是 属性,你不能这样使用 属性 委托。你所要做的就是像这样为 Map
编写一个装饰器:
class ObservableMap<K, V>(private val map: MutableMap<K, V>) : MutableMap<K, V> by map {
override fun put(key: K, value: V): V? {
TODO("not implemented")
}
override fun putAll(from: Map<out K, V>) {
TODO("not implemented")
}
override fun remove(key: K): V? {
TODO("not implemented")
}
}
这里我们将所有操作委托给支持 map
并且您只需要在上述方法中 adding/deleting 时实现您的逻辑。
我不确定你所说的 update
是什么意思,但如果你的意思是 "a value in the map gets overwritten" 那么你可以在 put
.
中处理它
您可以这样使用 ObservableMap
:
val map = ObservableMap(ConcurrentHashMap<String, String>())
请注意,如果您想支持 ConcurrentHashMap
的操作,您还需要为 AbstractMap<K,V>
和 ConcurrentMap<K,V>
添加 overrides
,因为它们添加了一些新操作,您可能想追踪。上面的代码只是一个例子。
我有一张地图,在我的例子中是 ConcurrentHashMap<String, Device>
,当在 websocket 上接收到一些事件时它正在更新。我想在此地图上实现一个可观察对象,以了解何时添加、更新或删除条目。我尝试使用 ObservableProperty
但在更改地图时没有调用任何方法。
var deviceCache : ConcurrentHashMap<String, Device> by MyObservable(ConcurrentHashMap())
class MyObservable<T, V>(initialValue: ConcurrentHashMap<T, V>) : ObservableProperty<ConcurrentHashMap<T, V>>(initialValue) {
override fun afterChange(property: KProperty<*>, oldValue: ConcurrentHashMap<T, V>, newValue: ConcurrentHashMap<T, V>) {
super.afterChange(property, oldValue, newValue)
log.e("new value is $newValue")
}
override fun beforeChange(property: KProperty<*>, oldValue: ConcurrentHashMap<T, V>, newValue: ConcurrentHashMap<T, V>): Boolean {
log.e("beforeChange called")
return super.beforeChange(property, oldValue, newValue)
}
}
谁能帮我解决这个问题?
问题是 Map
不是 属性,你不能这样使用 属性 委托。你所要做的就是像这样为 Map
编写一个装饰器:
class ObservableMap<K, V>(private val map: MutableMap<K, V>) : MutableMap<K, V> by map {
override fun put(key: K, value: V): V? {
TODO("not implemented")
}
override fun putAll(from: Map<out K, V>) {
TODO("not implemented")
}
override fun remove(key: K): V? {
TODO("not implemented")
}
}
这里我们将所有操作委托给支持 map
并且您只需要在上述方法中 adding/deleting 时实现您的逻辑。
我不确定你所说的 update
是什么意思,但如果你的意思是 "a value in the map gets overwritten" 那么你可以在 put
.
您可以这样使用 ObservableMap
:
val map = ObservableMap(ConcurrentHashMap<String, String>())
请注意,如果您想支持 ConcurrentHashMap
的操作,您还需要为 AbstractMap<K,V>
和 ConcurrentMap<K,V>
添加 overrides
,因为它们添加了一些新操作,您可能想追踪。上面的代码只是一个例子。