Как организовать Java-проект без пакетов?

#java #information-hiding

#java #сокрытие информации

Вопрос:

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

Есть ли какой-нибудь способ организовать эти java-файлы в «пакеты», не нарушая принципа сокрытия информации?

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

1. Если все ваши файлы находятся в одном пакете и все они являются частными, в этом действительно нет смысла, поскольку это было бы так же, как если бы все они были общедоступными в первую очередь.

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

Ответ №1:

Для этого и предназначены модули Java 9. Они вводят дополнительный уровень инкапсуляции.

 private
package-private
module-private
public
 

module-private являются общедоступными членами в пакетах, которые не экспортируются.

В следующем примере класс PublicClass находится в пакете com.library . В том же пакете есть module-info.java файл, который объявляет модуль Java и экспортирует пакеты, которые являются общедоступным API. Все классы в пакетах, которые не экспортируются, не будут видны из модулей, которые зависят от этого.

 package com.library;

public class PublicClass {}
 
 package com.library.internal;

public class InternalClass {}
 
 module com.library {
    exports com.library;
}
 
 module com.app {
    requires com.library;
}
 
 package com.app;

class App {
    void run() {
        new InternalClass(); // compile-time error
        new PublicClass(); // success
    }
}