2012-02-09 13 views
0

ServiceReferencecompareToは、service.rankingとservice.idの観点から定義されています。しかし、service.rankingはServiceRegistrationで動的/非同期に更新できるようです。 setProperties。これは、2つのServiceReference間のcompareToがコールごとに異なる可能性があることを意味します。これは、ServiceReferenceをComparableの一般的な使用すべてで使用できなくします。たとえば、並べ替え中にランク付けが非同期に更新されるとArrays.sortが誤動作し、service.rankingがまったく更新されていればTreeSet < ServiceReference>が破損します。なぜServiceReferenceはComparableを実装していますか?

  1. なぜServiceReferenceはComparableを実装していますか? compareToをまったく持っていないほうが良いでしょう。あるいは、少なくともComparableを実装していないと、開発者がAPIを不適切に使用するのを避けることができません。

  2. サービスのソートされたリストを維持するためのデータ構造の提案はありますか?特に、カーディナリティ= "0..n"参照のためのDSバインドメソッドでの使用のために。

+0

リストを並べ替えることができます。並べ替えが進行している間に更新されないと仮定し、現在のランキングを表示することができます。数秒ごとに繰り返し、あなたは「ライブディスプレイ」を持っています。 – bdares

+0

私はそれを行うことができますか、またはデコレートソートデコレート。それを行う時間の複雑さはあまり良くありません。それでも私は#1に戻ります。 –

答えて

0

登録時に正しい順序で表示されます。

の登録後にのプロパティを変更しても、オブジェクトをその順序で動かすことには影響しません。

これは、この動作を行う唯一のJDKクラスではありません。間違いなく、DelayedオブジェクトはDelayQueueで、が追加された場合はとなります。 のキューに追加した後に変更すると、変更されていないかのように、.take()で順番に利用可能になります。

+0

DelayQueueに要素を追加するには、優先度ヒープに追加する要素のO(lg n)compareToが必要です。それをDelayQueueに追加している間にservice.rankingが突然変異するとどうなりますか? –

2

ServiceReferenceオブジェクトは変更できません。 Comparableオブジェクトが不変であるという要件はないので、なぜServiceReferenceオブジェクトがそうであると思うのか分かりません。

ServiceTrackerはServiceReferencesのComparable性質を使用して、追跡サービスの並べ替え順序を維持します。

DS 1.2では、参照されるサービスのサービスプロパティが変更されたときに呼び出される参照用の新しい「更新された」メソッドを紹介します。このメソッドを使用して、参照されているサービスのサービスプロパティが変更されたときにデータ構造を再利用することができます。

+0

私はServiceReferenceまたはComparableが不変であるとは思わない。私はcompareToが役に立つと理解しています。私はServiceReferenceを使用するときにComparableが有用であると理解していませんが、有害な場合の例があります。有用な例がありますか? –

+0

上記のとおり、ServiceTrackerは、ソートされた一連のトラッキングされたサービスを維持するためにこのサービスを使用します。したがって、場合によっては非常に便利です。セット内のサービスが変更されたときに頼らない一連のサービスを持っているあなたのケースでは機能しません。 –

+0

ソートされたサービスのリストを返すServiceTrackerのメソッドが表示されません。私はそれを逃していますか?いずれにしても、ServiceTrackerは実際にはComparableインターフェイスを使用していません。compareToメソッドを使用するだけなので、なぜServiceReferenceがComparableを実装するのが便利なのか理解できません。 –

関連する問題