Java: видимость подпакета?

У меня есть два пакета в моем проекте: odp.proj и odp.proj.test. Существуют определенные методы, что я хочу быть видимым только к классам в этих двух пакетах. Как я могу сделать это?

Править: Если нет никакого понятия подпакета в Java, есть ли какой-либо путь вокруг этого? У меня есть определенные методы, что я хочу быть доступным только тестерам и другим членам того пакета. Я должен просто бросить все в тот же пакет? Использовать обширное отражение?

138
задан starblue 13 February 2015 в 22:25
поделиться

6 ответов

Ты не можешь. В Java нет концепции подпакета, поэтому odp.projek и odp.projek.test являются полностью раздельными пакетами.

155
ответ дан 23 November 2019 в 23:28
поделиться

Имена ваших пакетов намекают на то, что приложение предназначено для юнит-тестирования. Типичный пример - поместить классы, которые вы хотите протестировать, и код юнит-теста в один и тот же пакет (в вашем случае odp.proj), но в разные деревья исходных текстов. Таким образом, вы поместите свои классы в src/odp/proj, а ваш тестовый код в test/odp/proj.

Java имеет модификатор доступа "package", который является модификатором доступа по умолчанию, когда ни один из них не указан (т.е. вы не указываете публичный, приватный или защищенный). С модификатором доступа "пакетный" доступ к методам будет иметь только классы в odp.proj. Но имейте в виду, что на модификаторы доступа на Java нельзя полагаться для обеспечения соблюдения правил доступа, потому что при отражении возможен любой доступ. Модификаторы доступа просто внушают (если только не присутствует ограничительный менеджер безопасности)

.
57
ответ дан 23 November 2019 в 23:28
поделиться

Это не особая связь между odp.proj и odp.projek.test - они просто названы как очевидно связанные между собой.

Если пакет odp.projek.test просто предоставляет тесты, то вы можете использовать одно и то же название пакета (odp.proj). IDE типа Eclipse и Netbeans создадут отдельные папки (src/main/java/odp/proj и src/test/java/odp/proj) с одним и тем же именем пакета, но с семантикой JUnit.

Обратите внимание, что эти IDE сгенерируют тесты для методов в odp.proj и создадут соответствующую папку для методов, которых не существует.

.
11
ответ дан 23 November 2019 в 23:28
поделиться

Когда я делаю это в IntelliJ, мое дерево исходных текстов выглядит так:

src         // source root
- odp
   - proj   // .java source here
- test      // test root
  - odp
     - proj // JUnit or TestNG source here
5
ответ дан 23 November 2019 в 23:28
поделиться

Не ставя модификатор доступа перед методом, который, как вы говорите, является пакетным private.
Посмотрите на следующий пример.

package odp.proj;
public class A
{
    void launchA() { }
}

package odp.proj.test;
public class B
{
    void launchB() { }
}

public class Test
{
    public void test()
    {
        A a = new A();
        a.launchA()    // cannot call launchA because it is not visible
    }
}
0
ответ дан 23 November 2019 в 23:28
поделиться

EDIT: Если нет понятия a Субпакет на Java, есть ли какой-нибудь способ вокруг этого? У меня есть определенные методы что я хочу быть доступным только для тестировщики и другие участники этого Пакет.

Вероятно, это немного зависит от ваших мотивов, чтобы не отображать их, но если единственная причина в том, что вы не хотите загрязнять публичный интерфейс вещами, предназначенными только для тестирования (или какой-то другой внутренней вещью), я бы поместил методы в отдельный публичный интерфейс и попросил бы потребителей "скрытых" методов использовать этот интерфейс. Это не помешает другим использовать интерфейс, но я не вижу причин для этого.

Для юнит-тестов, и если это возможно без переписывания лота, следуйте предложениям использовать тот же самый пакет.

.
4
ответ дан 23 November 2019 в 23:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: