Рассмотрите возможность перепроектирования вашего API, чтобы иметь "внешние" и "внутренние" API.
Хотя вы не можете сделать это с помощью собственных модификаторов доступа Java, вы можете упаковать ваши классы, используя:
package com.mycomp
package com.mycomp.internal
В пакете com.mycomp вы публикуете свои общедоступные API-интерфейсы, от которых вы разрешаете «публичным» пользователям зависеть; в большинстве случаев в этом пакете больше интерфейсов, чем классов.
В пакете
com.mycomp.internal реализовано большинство интерфейсов, имеющихся в com.mycomp . Именование внутреннего пакета эффективно говорит людям, что классы в пакете являются внутренними для API, и выбор зависимости от внутренних пакетов может нарушить их коды в будущих выпусках. Более того, если бы вы могли использовать OSGi, вы можете экспортировать только пакет com.mycomp , что делает com.mycomp.internal эффективно "скрытым" от остального мира.
FWIW, mockito использует этот метод упаковки для своего API.
Недостатком этого метода является зависимость от конвенции.