Как я могу совместно использовать низкоуровневые служебные классы между пакетами, но не предоставлять их общедоступному API?

У меня есть проект библиотеки, и я хочу ограничить общедоступный API, но у меня также есть некоторые низкоуровневые служебные классы, которые являются общими для некоторых пакетов. Мне нужно, чтобы эти служебные классы были общедоступны, но я не хочу раскрывать их в общедоступном API библиотеки.

Я думал о рефлексии, но это кажется немного грязным для этого приложения.

Любая помощь будет оценена по достоинству.


person Grammin    schedule 06.02.2012    source источник


Ответы (2)


Не включайте эти классы в документацию API или документируйте их жирным предупреждением: Этот класс предназначен только для внутреннего использования и может быть изменен или удален в будущих версиях API. Не используйте его.

Также полезно поместить эти классы в пакет com.foo.bar.internal.

person JB Nizet    schedule 06.02.2012
comment
это то, что делает apache, например - person vextorspace; 06.02.2012
comment
Мы думали об использовании внутреннего пакета .internal, но не знали, будет ли это иметь смысл. - person Grammin; 06.02.2012

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

Если производительность не имеет значения, вы можете создать трассировку стека (Thread.currentThread.getStackTrace()) в конструкторе вашего служебного класса. Затем вы можете проверить стек вызовов для вызывающей стороны конструктора и создать исключение времени выполнения, если «немедленная» вызывающая сторона не относится к пакету/классу вашей библиотеки.

person shams    schedule 06.02.2012