|
O uso de
um mecanismo Construtor pode tornar o processo de instanciação de classes
mais confortável e menos sujeito a erros. Abaixo uma transcriação do
mecanismo apresentado no livro “Effective Java” (Cap.2). |
|
class Assunto{ private final int
fato1; private final int
fato2; private final int
fato3; public static class Construtor{ private int
fato1=1; private int
fato2=2; private int
fato3=3; public Construtor
fato1(int f){ this.fato1=f; return this; } public Construtor
fato2(int f){ this.fato2=f; return this; } public Construtor
fato3(int f){ this.fato3=f; return this; } public Assunto construir(){ return new Assunto(this); } }
Assunto(){fato1=0; fato2=0; fato3=0;}
Assunto(Construtor construtor){
fato1=construtor.fato1;
fato2=construtor.fato2; fato3=construtor.fato3; } public int
fato1(){return fato1;} public int
fato2(){return fato2;} public int
fato3(){return fato3;} } class construcao{ static void imprAssunto(Assunto a){ System.out.println( "fato1="+a.fato1()+"
fato2="+a.fato2()+" fato3="+a.fato3()); } public static void main(String[] arg){ Assunto b=new Assunto(); Assunto
a=new Assunto.Construtor().fato3(30).fato1(10).construir();
imprAssunto(a); } } |
|
A
linguagem Java permite dois tipos de classes definidas dentro de uma classe.
Se a classe estiver modificada por static então ela é uma classe aninhada
(nested) se a classe não for modificada por static então ela é uma classe
interna (inner). No programa acima Construtor é uma classe aninhada. Uma
instância de uma classe interna tem referência para uma instância da classe
onde ela foi definida. Esta referência da instância interna para a instância
externa é ajustada normalmente de forma automatica, mas o programador pode
utilizar a expressão: <instanciaexterna>.new
<ClasseInterna>(<argumentos>) para
criar instâncias internas ligadas a uma dada instanciaexterna, por exemplo: class
tstClasseInterna{ public static void main(String[] arg){ Raiz r = new Raiz(); Raiz.Interna1 i= r.new Interna1(); Raiz.Interna1.Interna2 j = i.new
Interna2(); j.m(); } } class Raiz{ public class Interna1{ public class Interna2{ public void
m(){System.out.println("oi");} } } } |