2012-02-09 59 views
0

ServiceReference。根据service.ranking和service.id定义compareTo。但是,似乎service.ranking可以通过ServiceRegistration动态/异步更新。 setProperties。这意味着两个ServiceReference之间的compareTo可以因呼叫而异,这使得ServiceReference对于Comparable的所有典型用途都不可用。例如,如果排序在排序时异步更新,则Arrays.sort将会行为不当,如果service.ranking根本没有更新,则TreeSet < ServiceReference>将会损坏。为什么ServiceReference实现Comparable?

  1. 为什么ServiceReference实现Comparable?如果没有compareTo,或者至少没有实现Comparable似乎更好,以避免鼓励开发人员不恰当地使用API​​。

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

+0

您可以对列表进行排序,假定在排序正在进行的时间(希望很短)期间没有更新,并显示“当前”排名。每隔几秒重复一次,你就有一个“实时显示”。 – bdares 2012-02-09 06:54:43

+0

我可以做到这一点,或装饰排序undecorate。这样做的时间复杂性并不好,它仍然让我回到了第一名。 – 2012-02-09 23:25:09

回答

0

它是可比的,所以当它被注册时,它的顺序是正确的。

如果您在注册后更改属性,它将不会影响按顺序移动对象。

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

+0

将元素添加到DelayQueue需要元素上的O(lg n)compareTo将其添加到优先级堆。如果service.ranking在将其添加到DelayQueue中时发生变化,该怎么办? – 2012-02-09 23:20:35

2

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

ServiceTracker使用ServiceReferences的Comparable特性来维护跟踪服务的排序顺序。

在DS 1.2中,我们引入了一个新的“更新”方法用于引用服务的服务属性发生更改时调用。当引用服务的服务属性发生更改时,可以使用此方法触发数据结构的度假区。

+0

我不希望ServiceReference或Comparable是不可变的。我明白,compareTo可能是有用的。我不明白何时使用ServiceReference作为一个Comparable是有用的,但我确实有例子说明什么时候它是有害的。你有什么时候有用的例子吗? – 2012-02-09 23:16:13

+0

正如我上面提到的那样,ServiceTracker使用它来维护一组有序的服务。所以在某些情况下它非常有用。如果你有一组服务在服务集中的服务发生变化时无法提供服务,它就不起作用。 – 2012-02-12 18:17:09

+0

我在ServiceTracker上看不到一个返回已排序服务列表的方法。我错过了吗?无论如何,ServiceTracker实际上并没有像这样使用Comparable接口,它只是使用compareTo方法,所以我仍然不明白为什么它对ServiceReference实现Comparable有用。 – 2012-02-12 20:08:18

相关问题