为什么ServiceReference实现Comparable?

时间:2012-02-09 06:48:28

标签: java collections concurrency osgi

ServiceReferencecompareTo是根据service.ranking和service.id定义的。但是,似乎service.ranking可以通过ServiceRegistration动态/异步更新。setProperties。这意味着两个ServiceReference之间的compareTo可能因呼叫而异,这使得ServiceReference无法用于Comparable的所有典型用途。例如,如果在排序时异步更新排名,则Arrays.sort将会出错,并且TreeSet< ServiceReference>如果service.ranking完全更新,则会被破坏。

  1. 为什么ServiceReference实现Comparable?最好不要使用compareTo,或者至少不实现Comparable以避免鼓励开发人员不恰当地使用API​​。

  2. 是否有维护已排序服务列表的数据结构建议?特别是,由DS绑定方法用于基数=“0..n”引用。

2 个答案:

答案 0 :(得分:2)

ServiceReference对象不是不可变的。没有要求Comparable对象是不可变的,所以我不确定为什么你期望ServiceReference对象是这样。

ServiceTracker使用ServiceReferences的可比性质来维护被跟踪服务的排序顺序。

在DS 1.2中,我们为引用引入了一个新的“更新”方法,当引用服务的服务属性发生变化时,该方法被调用。当引用的服务的服务属性发生更改时,您可以使用此方法触发数据结构的求助。

答案 1 :(得分:0)

它是可比较的,因此当它被注册时,它的顺序正确。

如果在注册后更改属性,则对按顺序移动对象没有任何影响。

这不是唯一具有此行为的JDK类。对或错,Delayed对象在添加时在DelayQueue中排序。如果在添加到队列后更改延迟,则可以通过.take()按顺序将其提供,就好像它没有被更改一样。