Je vois ce que vous faites avec 2. Vous utilisez des classes en tant que packages et des packages en tant que modules afin que vous puissiez vous isoler dans le package mais toujours organiser au sein du package à l'aide de classes.
C'est très intelligent. Méfiez-vous des intelligents.
Cela vous obligera à bloquer plusieurs classes dans le même fichier source (que vous préférerez peut-être) et le chemin aura un mot en majuscule supplémentaire.
Cela vous obligera également à écrire tout code de test dans le package, sauf si vous utilisez la réflexion pour pirater votre chemin depuis l'extérieur.
Autre que cela, cela fonctionnera. Cela semblera juste bizarre.
Les gens sont plus habitués aux classes internes utilisées comme EntrySet dans Hashtable. Il est privé, donc je ne peux pas le créer, mais il implémente une interface publique, je lui parle donc via l'interface et j'en ai une pour moi.
Mais vous décrivez des classes auxquelles vous ne voulez pas que je parle, même via une interface. Donc pas d'interface pour moi. Cela signifie que je n'ai rien à regarder et que je ne suis pas confus (sauf si vous me fournissez la source).
Le plus gros problème que je prévois est le débutant déroutant de la maintenance de l'API. Vous pouvez leur envoyer de la documentation et des commentaires, mais ne soyez pas surdimensionné lorsqu'ils ne lisent ni ne font confiance à aucun d'eux.
Vous avez créé un autre modèle qui compense une déficience de la langue. Java n'a aucun modificateur d'accès qui accorde l'accès à un groupe de packages. J'ai entendu dire qu'un modificateur d'accès "module" avait été proposé mais je ne vois aucun signe que cela se produise.
Le modificateur d'accès par défaut (pas de modificateur) est probablement ce que vous utiliserez ici, sauf si cela ne vous dérange pas de me faufiler par 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 l'accès au module. De cette façon, vous pouvez conserver vos tests dans un package et le code dans un autre. Malheureusement, nous ne l'avons pas en Java.
La plupart des gens font juste 1 et développent l'API. Une bonne utilisation des interfaces évite la mise en œuvre.
Pirater ce que vous voulez en 1 est encore plus laid. Jetez un œil à la pile d'appels et lancez une exception chaque fois que ce qui vous a appelé provient d'un package que vous n'aimez pas. Eeew.