Мы должны написать библиотеку. Естественно, он должен иметь только очень маленький API (настолько широкий, насколько это необходимо, настолько маленький, насколько это возможно). Внутренние элементы библиотеки несколько сложны. Поэтому им нужно структурирование.
Для структурирования я в настоящее время вижу два пути:
1. использовать пакеты.
плюсы: библиотека может быть аккуратно структурирована. Все на своем месте.
минусы: использование классов через границы пакета требует открытых классов и, следовательно, расширяет API всей библиотеки.
2. использовать статические внутренние классы, все в одном пакете.
плюсы: нужны только очень небольшие публичные вещи (классы, методы и т. д.).
минусы: классы скрыты только для их структурирования. Это был бы один из очень немногих случаев использования, когда используется так много статических внутренних классов. Разработчики не привыкли к этому и могут не заметить их.
Есть ли лучший способ получить маленький API в хорошо структурированной библиотеке?
Изменить: я забыл упомянуть: это для библиотеки Android. Поэтому нет java9.
Ответы:
Я вижу, что вы делаете с 2. Вы используете классы как пакеты, а пакеты как модули, так что вы можете изолировать себя в пакете, но при этом организовывать внутри пакета, используя классы.
Это очень умно. Остерегайтесь умных.
Это заставит вас заклинить несколько классов в одном и том же исходном файле (который вы могли бы предпочесть), и путь будет содержать дополнительное заглавное слово.
Это также заставит вас написать любой тестовый код в пакете, если вы не используете отражение, чтобы взломать ваш путь извне.
Кроме того, это будет работать. Это просто покажется странным.
Люди больше привыкли к тому, что внутренние классы используются как EntrySet в Hashtable. Он закрытый, поэтому я не могу его создать, но он реализует общедоступный интерфейс, поэтому я просто общаюсь с ним через интерфейс и что-то могу взять для меня.
Но вы описываете классы, с которыми вы не хотите, чтобы я разговаривал, даже через интерфейс. Так что нет интерфейса для меня. Это означает, что мне не на что смотреть и что я смущен (если вы не предоставите мне источник).
Самая большая проблема, которую я предвижу, это запутывающие новички, поддерживающие API. Вы можете бросить в них документацию и комментарии, но не превышайте размер, если они не читают или не доверяют ни одному из них.
Вы создали еще один шаблон, который восполняет недостаток в языке. В Java нет модификатора доступа, который предоставляет доступ к группе пакетов. Я слышал, что был предложен модификатор доступа "модуль", но не вижу никаких признаков того, что это происходит.
Модификатор доступа по умолчанию (без модификатора), скорее всего, будет использоваться здесь, если вы не возражаете против того, чтобы я пробирался через наследование, в этом случае защищенный.
Что вы действительно хотите, так это доступ к модулю. Таким образом, вы можете хранить свои тесты в одном пакете и код в другом. К сожалению, у нас его нет на Java.
Большинство людей просто делают 1 и расширяют API. Правильное использование интерфейсов удерживает давление от реализации.
Взломать то, что вы хотите в 1, еще страшнее. Посмотрите на стек вызовов и сгенерируйте исключение всякий раз, когда вам позвонили из пакета, который вам не нравится. Eeew.
источник
Во что бы то ни стало, разделите ваш код на пакеты. Это будет иметь большое значение для улучшения ремонтопригодности.
Чтобы конечные пользователи не могли получить доступ к тем вещам, которые им не нужны, вам нужно разделить API-интерфейс на интерфейс и реализацию.
Вы можете сделать это буквально, определив весь API в терминах интерфейсов Java и предоставив некоторое количество фабричных классов для создания объектов реализации. Это то, что делает JDBC.
Или вы можете сделать это по соглашению, создавая
internal
пакеты и документируя эти пакеты как зависящие от реализации и подлежащие изменению без предупреждения или обратной совместимости.источник