2016-06-07 2 views
9

Спецификации декларативных служб OSGi (DS) определяют аннотации, которые могут обрабатываться инструментами, такими как Bnd, в описании компонента xml, которое используется во время выполнения. 112.8.1 в спецификации R6 говорит:Почему нет аннотаций декларативных услуг OSGi (DS), унаследованных от суперклассов?

The Component Annotations are not inherited, they can only be used on a given class, annotations on its super class hierarchy or interfaces are not taken into account.

Почему они указаны, чтобы не допустить наследование?

ответ

11

Аннотации DS, предоставленные проектом Apache Felix, однажды имели поддержку расширяемости DS. Основываясь на этой реализации, мы попытались стандартизировать это как часть работы, посвященной официальным аннотациям OSGi DS.

Проблема заключается в том, что мы сталкиваемся с неприятными проблемами связи между двумя классами реализации через границы пакетов, и мы не можем правильно выражать эту зависимость, используя заголовки Import-Package или Require-Capability.

Некоторые проблемы, возникающие в виду:

  • Как правило, вы хотите сделать bind и unbind методы частного. Было бы нормально, если бы DS вызвал частный метод bind или unbind в базовом классе? (Технически это вполне можно сделать, но было бы концептуально нормально?)
  • Что делать, если у нас есть частные методы, но разработчик решает изменить имя частных методов? В конце концов, они являются частными, а не частью поверхности API. Расширитель не будет работать, поскольку методы bind/unbind перечислены в дескрипторах, предоставляемых классом расширения и для него, и они все еще называют имена старых методов.
  • Если мы не поддерживаем частные имена методов для этого, нам потребуются эти методы bind/unbind, которые необходимо защищать или публиковать. И, таким образом, мы вынуждаем методы реализации-детализировать часть API. Не очень приятно ИМХО.
  • Примечание: приватные методы пакета не работают, поскольку два разных пакета не должны использовать один и тот же пакет с различным содержимым.

Мы тогда утверждали, что было бы нормально иметь такое наследование в одном комплекте, но пришел к выводу, что это ограничение, объяснения вокруг него и т. Д. Не стоили бы усилий. Поэтому мы снова отбросили эту функцию из дорожной карты спецификации.

+1

«И, таким образом, мы вынуждаем методы реализации-детализировать себя в API. Не очень приятно ИМХО». В нашей модели компонентов (то есть 90%, как DS) только методы привязки и сеттера могут быть только общедоступными. Поскольку классы компонентов обычно не находятся в экспортированных пакетах, эти функции не будут частью какого-либо API. На мой взгляд, вызов метода.setAccessible (true) намного хуже, чем заставить людей использовать общедоступные методы связывания. –

+0

Но класс компонента может использоваться как объект службы, поэтому эти общедоступные методы bind/unbind существуют в общему объекту службы. –

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