Могу ли я запретить пакету импортировать определенные другие пакеты в Java

#java #eclipse

#java #eclipse

Вопрос:

Есть ли в Java или eclipse (или плагине eclipse) функция, позволяющая запретить одному пространству имен пакетов использовать другое, когда весь код находится в одном проекте Java, независимо от видимости общедоступного класса?

например, пакет «myapp.model» может никогда не импортироваться из «myapp.fxview»

Предыстория

Я пишу приложение, используя архитектуру «Model View Controller» на Java с использованием eclipse.

«myapp.model» содержит чистый Java-код, никаких внешних библиотек или кода, зависящего от платформы «myapp.fxview» содержит классы, переопределяющие классы JavaFX

Я хочу убедиться, что код моей модели не «загрязнен» зависимостями от кода представления (например, случайно используя перечисление из реализации «view» в моей модели), чтобы я мог использовать свою модель на нескольких платформах (JavaFX PC, Android, серверная часть веб-сервера)

Я хотел бы сохранить весь свой код в одном проекте, чтобы минимизировать время, затрачиваемое на проблемы с настройкой проекта / рабочей области. (Я знаю, что эту «проблему» было бы легко решить с помощью отдельных проектов)

Комментарии:

1. Короткий ответ: да (по крайней мере, в Eclipse было что-то подобное). К сожалению, я не знаю, где именно это находится у меня в голове. Однако я бы не стал полагаться на Eclipse для этого. Еще одна вещь, о которой я мог подумать: возможно, здесь могла бы помочь модульная система Java (мне нужно было бы еще раз взглянуть на это).

2. Вы можете разделить свой код на проекты, а затем указать так называемые правила доступа : в проекте > Свойства: вкладка Проекты Путь сборки Java выберите правила доступа к подузлу требуемого проекта и нажмите Редактировать …

3. Когда вы пишете код в myapp.model , просто не пишите никаких инструкций импорта для my app.fxview . Вам нужно явно импортировать классы из другого пакета, если вы хотите их использовать, если вы явно не импортируете классы, то вам запрещено их использовать (если вы не прибегаете к динамическим методам, таким как отражение).

4. Томас, спасибо. Два других, пожалуйста, прочитайте вопрос. Я очень четко заявил, что меня не интересуют представленные вами варианты. Оба упомянутых вами варианта имеют серьезные недостатки в более крупных проектах. В настоящее время у меня есть проект на Java 8, над которым работает более 300 подпроектов. 7 разработчики программного обеспечения смогли случайно внести свой вклад в ад зависимости благодаря этим методам.

5. Я прочитал ваш вопрос и не согласен с тем, что вы явно указали в вопросе, что то, что я предложил, вам не подходит. В любом случае, это общедоступное пространство, и предложение все еще может помочь другим, которым может не понадобиться дополнительная сложность модульной системы. Возможно, вы захотите изучить возможности инкапсуляции модульной системы Java , как предложено в вашем ответе.

Ответ №1:

Используя систему модулей, доступную в Java 9 или новее. Существуют объявления модуля, такие как «exports…to «, или «opens…to «. Используя их, вы можете конкретно ограничить, какие пакеты доступны где. Чтобы поддержать это, лучше реструктурируйте имена пакетов, чтобы представить, что может быть несколько представлений (myapp.fxview -> myapp.view.fx).

Этот непроверенный код примерно показывает, как это будет выглядеть

 module modelmodule {
    exports myapp.model to myapp.view.fx;
    exports myapp.model to myapp.application;
}

module viewmodule {
    exports myapp.view.fx to myapp.application;
}
  

@seehttps://www.oracle.com/corporate/features/understanding-java-9-modules.html

Спасибо Томасу в комментариях за то, что указал мне правильное направление. Я использовал Java 8 на работе и поэтому придерживался того же самого дома. Следовательно, до сих пор я понятия не имел о системе модулей.