Vedo cosa stai facendo con 2. Stai usando le classi come pacchetti e pacchetti come moduli in modo da poterti isolare all'interno del pacchetto ma comunque organizzare all'interno del pacchetto usando le classi.
È molto intelligente. Attenzione ai furbi.
Questo ti costringerà a bloccare più classi nello stesso file sorgente (che potresti preferire) e il percorso avrà una parola maiuscola in più.
Questo ti costringerà anche a scrivere qualsiasi codice di prova all'interno del pacchetto a meno che tu non usi la reflection per entrare dall'esterno.
A parte questo, funzionerà. Sembrerà strano.
Le persone sono più abituate alle classi interne utilizzate come EntrySet in Hashtable. È privato, quindi non posso crearlo, ma implementa un'interfaccia pubblica, quindi parlo semplicemente attraverso l'interfaccia e ne ho una per me.
Ma stai descrivendo classi con le quali non vuoi che io parli nemmeno attraverso un'interfaccia. Quindi nessuna interfaccia per me. Questo significa che non ho nulla da guardare ed essere confuso (a meno che tu non mi fornisca la fonte).
Il problema più grande che prevedo è che questi principianti confusi mantengono l'API. Puoi inviare loro documentazione e commenti, ma non essere sovvertito quando non leggono o si fidano di nessuno dei due.
Hai creato ancora un altro modello che compensa una mancanza nella lingua. Java non ha modificatore di accesso che garantisce l'accesso a un gruppo di pacchetti. Ho sentito che era stato proposto un modificatore di accesso al "modulo" ma non vedo alcun segno che ciò accada.
Il modificatore di accesso predefinito (nessun modificatore) è probabilmente quello che utilizzerai qui a meno che non ti dispiaccia che io entri di nascosto attraverso l'eredità, nel qual caso protetta.
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
Quello che vuoi veramente è l'accesso al modulo. In questo modo è possibile conservare i test in un pacchetto e il codice in un altro. Purtroppo non ce l'abbiamo in Java.
Molte persone fanno solo 1 ed espandono l'API. L'uso corretto delle interfacce mantiene la pressione sull'implementazione.
L'hacking di ciò che vuoi in 1 è ancora più brutto. Dai un'occhiata allo stack di chiamate e genera un'eccezione ogni volta che ciò che ti ha chiamato proviene da un pacchetto che non ti piace. Eeew.