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

Я делаю проект в NetBeans и сталкиваюсь с проблемой, подобной той, которая уже задавалась на этом сайте - Как разделить личные данные пакета между двумя пакетами в Java? С небольшой разницей, скажем, разработчик приложения может видеть мою кодовую базу. Я подумал, чтобы публичный класс в пакете B сказал "класс коммуникатора", а его конструктор имел доступ к пакету по умолчанию и передавал его экземпляр в конструктор классов пакета A. По сути, я мешаю разработчику (использующему пакет C) создавать экземпляры любые классы внутри пакета А. Это будет работать, однако это не очень хороший подход, я думаю. Кроме того, этот вопрос был задан три года назад. Есть ли лучший подход / метод, доступный для этого сейчас, который является NEAT и / или предполагает меньшую связь между пакетами A и B.

PS: я новичок в Java. Любая помощь будет оценена.

2 ответа

Вы можете ввести модуль, который имеет ссылку на другие два пакета, и заставить этот модуль действовать как мост. Это одна вещь, которую можно сделать до Java 8

Я верю, что ваш подход сработает, но вы должны спросить себя, стоит ли оно того. Это повлияет на читабельность вашего кода.

Вы пытаетесь защитить себя от преднамеренного или случайного неправильного использования этих пакетов?

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

Communicator communicator = ...;

Constructor<ObjA> constructor = ObjA.class.getConstructor(Communicator.class);
constructor.setAccessible(true);
ObjA objectFromA = constructor.newInstance(communicator);

Если у вас есть контроль над средой исполнения Java, то с менеджером безопасности можно что-то сделать, чтобы предотвратить подобные вещи.

Могут также быть вещи, которые могут быть сделаны с ClassLoaders, чтобы управлять доступом одного модуля к другому модулю. Класс загружает другие классы, используя свой собственный ClassLoader; Пользовательский ClassLoader может запретить доступ к частным частям другого модуля. Именно так (я считаю) OSGi контролирует доступ между модулями.

Решения с участием менеджера безопасности или загрузчика классов потребуют от вас некоторого контроля над используемой средой исполнения Java.

Если вы пытаетесь защитить себя только от случайного неправильного использования, вам может быть лучше положиться на именование пакетов, чтобы дать понять людям, что им не следует использовать классы. например package foo.bar.internal;

Эти пакеты будут использовать люди за пределами вашей команды / компании?

Если вы имеете какое-то влияние на среду сборки модулей, которые будут использовать ваш код, вы можете рассмотреть возможность добавления инструментов в конфигурацию сборки, чтобы запретить использование ваших личных пакетов. Например, проверка контроля импорта Checkstyle дает большой контроль над тем, какие пакеты могут быть импортированы откуда.

Другие вопросы по тегам