Existe alguma maneira de evitar a instanciação de uma classe fora do jar?

Estou desenvolvendo uma biblioteca que possui algumas classes que eu não gostaria que fossem instanciadas fora da minha lib. A única coisa que sei é que um construtor pode ser package protected, o que restringe sua instanciação ao pacote que pertence (certo?). Eu até poderia usar isso, o problema é que me obrigaria a usar uma estrutura de pacotes baseado nessa minha necessidade. Por exemplo, se eu tenho a seguinte estutura:

pacoteTipo1
ClasseTipo1A
ClasseTipo1B

pacoteTipo2
ClasseTipo2A
ClasseTipo2B

Digamos que a ClasseTipo1A precise instanciar alguma classe do pacoteTipo2 (ClasseTipo2A p.ex.) e eu não quisesse que essa mesma classe fosse instanciada fora da minha lib. A única maneira que encontrei foi mudando a estrutura de pacotes para

pacoteTipo1
ClasseTipo1A
ClasseTipo1B
[color=blue]ClasseTipo2A[/color]

pacoteTipo2
ClasseTipo2B

Daí eu declararia o construtor da classe ClasseTipo2A como package protected. Mas isso mudaria totalmente minha organização de pacotes. Existe alguma outra forma de fazer isso (sem ter que basear minha estrutura de pacotes nessa “segurança”) ? Outra forma seria declarar a ClasseTipo2A dentro da ClasseTipo1A, mas isso novamente mudaria minha estrutura.

Não sei se deu pra entender, achei difícil de explicar minha dúvida.

Obrigado.

Não teria como você tentar usar classes internas?

Se bem que, por conta do reflection, é possível fazer quase qualquer coisa…

A questão é que usando classes internas eu teria que mudar a estrutura do meu código q deixaria de ter uma separação “funcional” e teria uma separação baseada nessa minha necessidade.

É que falando genericamente, fica meio dificil de pensar na situação…

Não seria mais fácil você dizer porque o ClasseTipo2A não pode estar visível para as outras classes? Dependendo do motivo, acho que não teria mesmo como fazer isso sem mudar a estrutura das suas classes…

Cara, não sei se te ajuda, mas o protected não é um modificador de acesso à uma classe. Se vc colocar protected vai ver a seguinte mensagem: “Illegal modifier for the class Default; only public, abstract & final are permitted” (no eclipse).

Vc tem que usar o acesso default. Cria sua classe assim:

package teste;

classe SomentePackage{
}

Desse modo, nem fora da package vc consegue fazer

SomentePackage sp = new SomentePackage();

A sim, mais uma coisa… Será mais fácil mudar a estrutura da sua aplicação. [=

[quote=Gustavokt]É que falando genericamente, fica meio dificil de pensar na situação…

Não seria mais fácil você dizer porque o ClasseTipo2A não pode estar visível para as outras classes? Dependendo do motivo, acho que não teria mesmo como fazer isso sem mudar a estrutura das suas classes…[/quote]

São diversas situações. De um modo geral, são classes de uso interno da biblioteca. Não queria expor as classes que uso internamente.

[quote=jakefrog] Cara, não sei se te ajuda, mas o protected não é um modificador de acesso à uma classe. Se vc colocar protected vai ver a seguinte mensagem: “Illegal modifier for the class Default; only public, abstract & final are permitted” (no eclipse).

Vc tem que usar o acesso default. Cria sua classe assim: [/quote]

Desculpe não fui muito claro, quando disse package protected estava justamente me referindo ao acesso default.

Minha questão é: Não tem como definir em uma lib quais classes serão de uso interno e quais serão de uso externo (da biblioteca), sem mexer na organização dos pacotes, que geralmente se organizam em alguma estrutura lógica? Entenderam? Se eu tenho uma estrutura definida logicamente, não é desejável mudá-la pra simplesmente para definir o acesso às classes. Me desculpem se estou falando uma besteira muito grande.

Obrigado pelas repostas.