Nous devons écrire une bibliothèque. Naturellement, il ne devrait avoir qu'une très petite API (aussi large que nécessaire que possible). Les internes de la bibliothèque sont un peu complexes. Par conséquent, ils ont besoin de structuration.
Pour la structuration, je vois actuellement de deux manières:
1. Utilisez des packages.
Avantages: La bibliothèque peut être soigneusement structurée. Tout à sa place.
Inconvénients : Utilisation des classes à travers les bordures de forfait Bonne catégorie de classes publiques et élargir donc l'API de toute la bibliothèque.
2. Utilisez des classes intérieures statiques, tout en un package.
Avantages : Seulement très peu de choses publiques (classes, méthodes, etc.) nécessaires.
Inconvénients: Les classes sont cachées uniquement pour les structurer. Ce serait l'un des nombreux cas d'utilisation où il y a tant de classes intérieures statiques utilisées. Les développeurs ne sont pas habitués à cela et pourraient les surplombrer.
Y a-t-il un meilleur moyen d'obtenir une petite API dans une bibliothèque bien structurée ?
Edit: J'ai oublié de mentionner: c'est pour une bibliothèque Android. Par conséquent, pas de Java9.
Je vois ce que vous faites avec 2. Vous utilisez des cours comme des packages et des packages en tant que modules afin que vous puissiez vous isoler dans l'emballage, mais organiser toujours dans l'emballage à l'aide de classes.
C'est très intelligent. Méfiez-vous d'intelligent.
Cela vous obligera à confier plusieurs classes multiples dans le même fichier source (que vous préférez préférer) et le chemin aura un mot capitalisé supplémentaire.
Cela vous obligera également à écrire n'importe quel code de test dans le package, à moins que vous n'utilisiez la réflexion pour pirater votre chemin de l'extérieur.
Autre alors cela fonctionnera. Cela semblera juste étrange.
Les personnes sont plus utilisées dans les classes intérieures utilisées comme - entrée dans HASHTABLE. C'est privé, donc je ne peux pas la créer, mais cela implémente une interface publique, donc je viens de parler à l'interface et que quelque chose m'atprise pour moi.
Mais vous décrivez les cours que vous ne voulez pas que je parle même à travers une interface. Donc aucune interface pour moi. Cela signifie que je n'ai rien à regarder et à être confus par (sauf si vous me fournissez une source).
Le plus gros problème que je prévois est ce débutant déroutant le maintien de l'API. Vous pouvez lancer la documentation et les commentaires mais ne sont pas sursisés lorsqu'ils ne lisent ni ne font confiance ni.
Vous avez créé un autre modèle qui compense une déficience dans la langue. Java n'a pas de modificateur d'accès qui accède à un accès à un groupe de packages. J'ai entendu dire qu'un modificateur d'accès "module" avait été proposé mais qu'il n'y ait aucun signe de cela ne se produisant.
Le modificateur d'accès par défaut (aucun modificateur) est probablement ce que vous utiliserez ici, à moins que vous ne vous dérangeez pas de me faufiler dans l'héritage, auquel cas protégé.
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
Ce que vous voulez vraiment, c'est un accès de module. De cette façon, vous pouvez garder vos tests dans un package et code dans un autre. Malheureusement, nous ne l'avons pas en Java.
La plupart des gens font juste 1 et développer l'API. Une utilisation correcte des interfaces conserve la pression de la mise en œuvre.
Piratage de ce que vous voulez en 1 est encore plus laid. Regez-vous à la pile d'appel et lancez une exception chaque fois que ce que vous avez appelé est d'un colis que vous n'aimez pas. EEEW.
Par tous moyens, séparez votre code en packages. Cela contribuera grandement à améliorer la maintenabilité.
Pour garder les utilisateurs finaux d'accéder aux choses qu'ils ne devraient pas, vous devez séparer votre API en interface et à la mise en œuvre.
Vous pouvez le faire très littéralement, en définissant toute l'API en termes de Java interfaces et en fournissant un certain nombre de classes d'usine pour produire des objets de mise en œuvre. C'est ce que le JDBC fait.
Ou vous pouvez le faire via la convention, en créant des packages internal
et en documentant ces packages en tant que dépendant de la mise en œuvre et sous réserve de changement sans avertissement ni compatibilité à l'envers.