Почему ServiceReference реализует Comparable? - PullRequest
0 голосов
/ 09 февраля 2012

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

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

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

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

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

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

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

0 голосов
/ 09 февраля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...