Sto creando una libreria o due per l'app Android e voglio mantenere le interfacce esposte della libreria al minimo per evitare che l'astrazione si diffonda ovunque, evitando di rendere pubbliche tutte le classi. Sto anche seguendo la struttura del pacchetto di Maven .
Venendo da C #, ho usato il modificatore di accesso internal
per ottenere ciò che voglio; se non ti è familiare, internal
concede l'accesso a qualsiasi cosa all'interno dell'assieme, ma non al di fuori di esso. Quindi le poche interfacce pubbliche sono veramente pubbliche. L'analogia più vicina, secondo me, è package-private
in Java, ma non funziona quando organizzo la mia libreria in pacchetti secondari.
Ad esempio, supponiamo di avere una classe Service1
in root e un'altra classe Service2
in un sottopackage sotto root. Mi piacerebbe che Service1
sia in grado di fare riferimento all'interfaccia di Service2
, ma preferibilmente non rendere Service2
public
poiché esporrà l'interfaccia di Service2
al di fuori del pacchetto, che non è quello che Intendo.
Immagino che questo non sia terribilmente complicato, ma sono un po 'confuso su come consentire ai pacchetti parent / di padre di accedere alle classi del pacchetto secondario senza renderle public
. L'unica soluzione che ho potuto veramente pensare è di 1) mettere tutto allo stesso livello di pacchetto che mi permetterebbe di usare package-private
per nascondere tutto ciò che non dovrebbe essere pubblicamente disponibile ma è estremamente disordinato o 2) succhialo e rendi pubbliche le mie interfacce, il che ovviamente offende la mia sensibilità.
Come si fa normalmente? Tutte le classi sono nello stesso pacchetto, ma possibilmente organizzate da sottodirectory? Ho ancora un approccio che mi piace davvero.