2015-07-21 7 views
5

Итак, я работаю на C# в течение нескольких лет, и теперь я работаю на Java. В C# вы можете использовать внутреннее ключевое слово, чтобы скрыть класс/метод из общедоступного представления, но разрешить доступ к определенным ассамблеям/пакетам, если вы его специально предоставляете. Когда я смотрю вокруг в Java, я не вижу ничего, что напрямую совпадает с внутренним.Есть ли способ использовать private-package в java для доступа к другим пакетам?

Я узнал о пакете-приватном. Однако это полностью скрывает его от внешнего мира. Есть ли способ в Java разрешить некоторым другим пакетам доступ ко внутреннему коду, не делая его общедоступным?

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

Спасибо.

+0

В Java нет механизма для выполнения того, что вы ищете. –

+0

В лучшем случае вы можете защитить свой класс. Тогда он будет доступен для других классов в одном пакете. – Zahrec

+2

В дополнение комментарий @ Zahrec: и он будет доступен для других классов вне пакета, если эти другие классы являются дочерними элементами класса с защищенным членом. Вероятно, это самое близкое, что вы можете дойти до того, что хотите. –

ответ

4

В Java нет концепции сборок, например, в .NET (по крайней мере, пока нет). Самое близкое - это пакеты OSGi, которые имеют эту концепцию (x-internal, x-friend и т. Д.), Но это не действительно базовая Java.

Если вы не используете OSGi, не должно возникнуть необходимости в этом осложнении. Просто убедитесь, что ваши модульные тесты находятся в том же пакете, что и тестируемый класс. Структура каталога Maven (которая является хорошим выбором, даже если вы не используете Maven) устанавливает вас для этого с помощью src/main/java, src/test/java и т. Д.

1

Вы можете поместить свой тест в одно и то же имя пакета в другом месте. Это рассматривается как один и тот же пакет, и вы можете получить доступ к частным классам пакета. Тестовые классы могут быть помещены в другой JAR-файл, такой как testSomething.jar, в то время как тестируемый пакет является частью на something.jar.

Это не работает с запечатанными пакетами.