Почему аннотации OSGi Declarative Services (DS) не наследуются от суперклассов?

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

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.

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


person BJ Hargrave    schedule 07.06.2016    source источник


Ответы (1)


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

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

Некоторые проблемы, которые приходят на ум:

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

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

person fmeschbe    schedule 07.06.2016
comment
Таким образом, мы вынуждаем методы деталей реализации становиться частью API. Не очень приятно ИМХО. В нашей компонентной модели (то есть на 90% похожей на DS) только методы связывания и установки могут быть только общедоступными. Поскольку классы компонентов обычно не входят в экспортируемые пакеты, эти функции не будут частью какого-либо API. На мой взгляд, вызов method.setAccessible(true) намного хуже, чем принуждение людей к использованию общедоступных методов привязки. - person Balazs Zsoldos; 07.06.2016
comment
Но класс компонента можно использовать как объект службы, поэтому эти общедоступные методы привязки/отвязки находятся в общем объекте службы. - person BJ Hargrave; 18.07.2016