Я вижу, что вы делаете с 2. Вы используете классы как пакеты, а пакеты как модули, так что вы можете изолировать себя в пакете, но при этом организовывать внутри пакета, используя классы.
Это очень умно. Остерегайтесь умных.
Это заставит вас заклинить несколько классов в одном и том же исходном файле (который вы могли бы предпочесть), и путь будет содержать дополнительное заглавное слово.
Это также заставит вас написать любой тестовый код в пакете, если вы не используете отражение, чтобы взломать ваш путь извне.
Кроме того, это будет работать. Это просто покажется странным.
Люди больше привыкли к тому, что внутренние классы используются как EntrySet в Hashtable. Он закрытый, поэтому я не могу его создать, но он реализует общедоступный интерфейс, поэтому я просто общаюсь с ним через интерфейс и что-то могу взять для меня.
Но вы описываете классы, с которыми вы не хотите, чтобы я разговаривал, даже через интерфейс. Так что нет интерфейса для меня. Это означает, что мне не на что смотреть и что я смущен (если вы не предоставите мне источник).
Самая большая проблема, которую я предвижу, это запутывающие новички, поддерживающие API. Вы можете бросить в них документацию и комментарии, но не превышайте размер, если они не читают или не доверяют ни одному из них.
Вы создали еще один шаблон, который восполняет недостаток в языке. В Java нет модификатора доступа, который предоставляет доступ к группе пакетов. Я слышал, что был предложен модификатор доступа "модуль", но не вижу никаких признаков того, что это происходит.
Модификатор доступа по умолчанию (без модификатора), скорее всего, будет использоваться здесь, если вы не возражаете против того, чтобы я пробирался через наследование, в этом случае защищенный.
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
Что вы действительно хотите, так это доступ к модулю. Таким образом, вы можете хранить свои тесты в одном пакете и код в другом. К сожалению, у нас его нет на Java.
Большинство людей просто делают 1 и расширяют API. Правильное использование интерфейсов удерживает давление от реализации.
Взломать то, что вы хотите в 1, еще страшнее. Посмотрите на стек вызовов и сгенерируйте исключение всякий раз, когда вам позвонили из пакета, который вам не нравится. Eeew.