Eu vejo o que você está fazendo com 2. Você está usando classes como pacotes e pacotes como módulos, para que você possa se isolar dentro do pacote, mas ainda assim se organizar dentro do pacote usando classes.
Isso é muito inteligente. Cuidado com astúcia.
Isso forçará você a bloquear várias classes no mesmo arquivo de origem (o que você prefere) e o caminho terá uma palavra em maiúscula extra.
Isso também forçará você a escrever qualquer código de teste dentro do pacote, a menos que você use a reflexão para invadir seu caminho de fora.
Fora isso, isso funcionará. Vai parecer estranho.
As pessoas estão mais acostumadas às classes internas usadas como EntrySet no Hashtable. É privado, então eu não posso criá-lo, mas implementa uma interface pública, então eu apenas falo com ele através da interface e tenho algo que você precisa.
Mas você está descrevendo classes com as quais não quer que eu converse, mesmo através de uma interface. Portanto, nenhuma interface para mim. Isso significa que não tenho nada para olhar e me confundir (a menos que você me forneça a fonte).
O maior problema que prevejo é que esses novatos confusos mantêm a API. Você pode enviar documentação e comentários para eles, mas não será superdimensionado quando eles não lerem ou confiarem em nenhum deles.
Você criou outro padrão que compensa uma deficiência no idioma. Java não possui modificador de acesso que conceda acesso a um grupo de pacotes. Ouvi dizer que um modificador de acesso "módulo" havia sido proposto, mas não vejo sinal disso.
O modificador de acesso padrão (sem modificador) provavelmente é o que você usará aqui, a menos que você não se importe de me infiltrar na herança, nesse caso protegido.
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
O que você realmente deseja é acesso ao módulo. Dessa forma, você pode manter seus testes em um pacote e código em outro. Infelizmente, não o temos em Java.
A maioria das pessoas faz apenas 1 e expande a API. O uso adequado de interfaces mantém a pressão fora da implementação.
Hackear o que você deseja no 1 é ainda mais feio. Dê uma olhada na pilha de chamadas e lance uma exceção sempre que o que você chamou é de um pacote que você não gosta. Eeew.