Просто чтобы уточнить ответ, который дал ColinD (я даже не знал о закрытых пакетах классах до года программирования на Java). Я полагаю, что с приложением, разработанным на основе DI, вы сделаете интерфейсы общедоступными и, возможно, некоторые абстрактные классы и Enums:
package org.my.service;
public interface Service {
public void process();
}
Тогда конкретная реализация будет приватной (без общедоступного ключевого слова)
package org.my.service;
class RealService {
public void process() {/*do something*/}
}
Это реализует концепцию сокрытия информации и означает, что детали реализации не проникают в публичный API. Это также означает, что вы не можете использовать класс за пределами этого пакета (ошибка времени компиляции, если вы попытаетесь - вы не можете «создать» его где-либо).
Опять же, как сказал ColinD, вы можете выполнить юнит-тестирование, потому что ваш юнит-тест будет находиться в org.my.service.