Vedo ciò che 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 organizzarlo all'interno del pacchetto usando le classi.
È molto intelligente. Attenzione ai furbi.
Questo ti costringerà ad inceppare più classi nello stesso file sorgente (che potresti preferire) e il percorso avrà una parola in maiuscolo.
Questo ti costringerà anche a scrivere qualsiasi codice di test all'interno del pacchetto, a meno che non usi la riflessione per entrare dall'esterno.
Altrimenti, funzionerà. Sembrerà strano.
Le persone sono più abituate alle classi interne che vengono utilizzate come EntrySet in Hashtable . È privato quindi non posso crearlo ma implementa un'interfaccia pubblica, quindi mi limito a parlarci attraverso l'interfaccia e ne ho preso uno per me.
Ma stai descrivendo classi alle quali non vuoi che parli anche attraverso un'interfaccia. Quindi nessuna interfaccia per me. Ciò significa che non ho nulla da guardare e da cui essere confuso (a meno che tu non mi fornisca la fonte).
Il problema più grosso che prevedo sono i neofiti confusi che mantengono l'API. Puoi pubblicare documentazione e commenti, ma non essere superquisiti quando non leggono o non si fidano di nessuno dei due.
Hai creato un altro pattern che compensa la mancanza della lingua. Java non ha modificatore di accesso che garantisce l'accesso a un gruppo di pacchetti. Ho sentito che un modificatore di accesso al "modulo" è stato proposto ma non vedo alcun segno che ciò accada.
Il modificatore di accesso predefinito (nessun modificatore) è probabilmente quello che userai qui, a meno che non ti dispiaccia che io entri di nascosto attraverso l'ereditarietà, nel qual caso protetto.
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 mantenere i test in un pacchetto e il codice in un altro. Purtroppo non ce l'abbiamo in Java.
La maggior parte delle persone fa solo 1 ed espande l'API. L'uso corretto delle interfacce mantiene la pressione sull'implementazione.
L'hacking di ciò che vuoi in 1 è ancora più brutto. Sbircia lo stack delle chiamate e genera un'eccezione ogni volta che ti chiamano da un pacchetto che non ti piace. Eeew.