Как сделать личный пакет? - PullRequest
0 голосов
/ 09 марта 2019

Я делаю библиотеку. У меня есть три пакета:

enter image description here

Электронная таблица - это основной пакет. Пакет io является внутренним пакетом для внутреннего использования . К сожалению, пользователь может получить к ним доступ, поскольку они являются публичными классами.

Я бы хотел сохранить этот пакет, поскольку он позволяет мне разделять понятия при программировании, но я хотел бы "спрятать" эти классы для конечного пользователя.

Что я мог сделать?

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Хорошо, что вы задаете себе этот вопрос! Я не вижу особого внимания в последнее время.

Поскольку OdsReader и OdsWriter используются только внутри класса Spreadsheet, просто переместите их в пакет spreadsheet, удаляя public клавишную панель видимости. Теперь они будут доступны только из классов пакета spreadsheed.

Предложенное выше решение, которое является слишком сложным для вашего варианта использования и которое должно использовать Java 9+ модулей (или OSGi - пожалуйста, нет!), Здесь на самом деле не требуется, но Тем не менее, это шаг вперед в сохранении частных и закрытых определений даже для Reflection нарушителей.


Как примечание, я вижу, что у вас есть пакет exceptions.
Я никогда не рекомендую делать это, так как вам придется предоставлять конструктор этих исключений пользователям вашего кода, и они смогут создавать их экземпляры по нет веским причинам.

Переместите исключения внутри пакетов, которые их используют, и объявите конструктор как частный пакет.

1 голос
/ 09 марта 2019

Начиная с java9, вы можете превратить эту библиотеку в модуль. См. этот урок головоломки .

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

Вы также можете использовать что-то вроде OSGi, модульной системы, предшествующей java9. У него тоже есть понятие, что есть уровень за пределами публики (назовем его «видимым»).

Последний вариант - использовать shenanigans загрузчика классов (где вы, например, переименовываете файлы классов в другое расширение на этапе сборки, и в вашем видимом пакете есть небольшой загрузчик, который создает загрузчик классов, который загружает классы, просматривая тот же самый файл). поместите в качестве видимого API, а затем загрузите файлы с альтернативным расширением (и defineClass), но это радикальный шаг, который вызывает немало головной боли. Я бы не принял его, если у вас нет веских причин спуститься в эту кроличью нору.

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