Аннотации DS, предоставленные проектом Apache Felix, однажды имели поддержку расширяемости DS. Основываясь на этой реализации, мы попытались стандартизировать это как часть работы, посвященной официальным аннотациям OSGi DS.
Проблема заключается в том, что мы сталкиваемся с неприятными проблемами связи между двумя классами реализации через границы пакетов, и мы не можем правильно выражать эту зависимость, используя заголовки Import-Package
или Require-Capability
.
Некоторые проблемы, возникающие в виду:
- Как правило, вы хотите сделать
bind
и unbind
методы частного. Было бы нормально, если бы DS вызвал частный метод bind
или unbind
в базовом классе? (Технически это вполне можно сделать, но было бы концептуально нормально?)
- Что делать, если у нас есть частные методы, но разработчик решает изменить имя частных методов? В конце концов, они являются частными, а не частью поверхности API. Расширитель не будет работать, поскольку методы
bind
/unbind
перечислены в дескрипторах, предоставляемых классом расширения и для него, и они все еще называют имена старых методов.
- Если мы не поддерживаем частные имена методов для этого, нам потребуются эти методы
bind
/unbind
, которые необходимо защищать или публиковать. И, таким образом, мы вынуждаем методы реализации-детализировать часть API. Не очень приятно ИМХО.
- Примечание: приватные методы пакета не работают, поскольку два разных пакета не должны использовать один и тот же пакет с различным содержимым.
Мы тогда утверждали, что было бы нормально иметь такое наследование в одном комплекте, но пришел к выводу, что это ограничение, объяснения вокруг него и т. Д. Не стоили бы усилий. Поэтому мы снова отбросили эту функцию из дорожной карты спецификации.
«И, таким образом, мы вынуждаем методы реализации-детализировать себя в API. Не очень приятно ИМХО». В нашей модели компонентов (то есть 90%, как DS) только методы привязки и сеттера могут быть только общедоступными. Поскольку классы компонентов обычно не находятся в экспортированных пакетах, эти функции не будут частью какого-либо API. На мой взгляд, вызов метода.setAccessible (true) намного хуже, чем заставить людей использовать общедоступные методы связывания. –
Но класс компонента может использоваться как объект службы, поэтому эти общедоступные методы bind/unbind существуют в общему объекту службы. –