2012-02-09 3 views
0

ServiceReference. compareTo определяется с точки зрения service.ranking и service.id. Однако кажется, что service.ranking может обновляться динамически/асинхронно через ServiceRegistration. setProperties. Это означает, что compareTo между двумя ServiceReference может варьироваться от вызова к вызову, что делает ServiceReference непригодным для всех типичных применений Comparable. Например, Arrays.sort будет плохо себя вести, если ранжирование будет обновляться асинхронно во время сортировки, а TreeSet < ServiceReference> будет повреждено, если service.ranking будет обновляться вообще.Почему ServiceReference реализует Comparable?

  1. Почему ServiceReference реализует Comparable? Казалось бы, лучше не иметь сравнения вообще, или, по крайней мере, не реализовать Comparable, чтобы не поощрять разработчиков использовать API неадекватно.

  2. Есть ли предложения по структуре данных для поддержки отсортированного списка услуг? В частности, для использования методами DS bind для мощности = "0..n" ссылок.

+0

Вы можете отсортировать список, предположив, что ни один не будет обновлен во время (надеюсь, короткого) времени, в котором выполняется сортировка, и отобразите «текущий» рейтинг. Повторяйте каждые несколько секунд, и у вас есть «живой дисплей». – bdares

+0

Я мог бы это сделать или украсить-sort-undecorate. Сложность времени для этого невелика, и это все еще возвращает меня к # 1. –

ответ

0

Это сопоставимо, поэтому, когда оно зарегистрировано, оно находится в правильном порядке.

Если вы изменили свойства после регистрации, это не повлияет на перемещение объекта вокруг в порядке.

Это не единственный класс JDK для такого поведения. Правильно или неправильно, объект Delayed заказан в DelayQueue, когда он находится . Если вы измените задержку после, добавив ее в очередь, она будет доступна через .take() в порядке, как если бы она не была изменена.

+0

Для добавления элемента в DelayQueue требуется O (lg n) compareTo для элемента, чтобы добавить его в кучу приоритетов. Что делать, если service.ranking мутирует при добавлении его в DelayQueue? –

2

Объекты ServiceReference не являются неизменяемыми. Нет требования, чтобы объекты Comparable неизменяемы, поэтому я не уверен, почему вы ожидаете, что объект ServiceReference будет таким.

ServiceTracker использует Сопоставимый характер ServiceReferences для поддержания порядка сортировки для отслеживаемых служб.

В DS 1.2 мы вводим новый «обновленный» метод для ссылок, который вызывается при изменении свойств службы ссылочной службы. Вы можете использовать этот метод для запуска службы вашей структуры данных при изменении свойств службы ссылочных сервисов.

+0

Я не ожидаю, что ServiceReference или Comparable будут неизменными. Я понимаю, что compareTo может быть полезным. Я не понимаю, когда использование ServiceReference как Comparable всегда полезно, но у меня есть примеры того, когда это вредно. У вас есть примеры, когда это полезно? –

+0

Как я уже упоминал выше, он используется ServiceTracker для обслуживания отсортированного набора отслеживаемых служб. Поэтому в некоторых случаях это очень полезно. Это просто не работает для вашего случая, когда у вас есть набор служб, которые не применяются при изменении службы в наборе. –

+0

Я не вижу метод ServiceTracker, который возвращает список отсортированных служб. Мне это не хватает?В любом случае ServiceTracker фактически не использует интерфейс Comparable как таковой, он просто использует метод compareTo, поэтому я до сих пор не понимаю, почему для ServiceReference полезно использовать Comparable. –

Смежные вопросы