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");}

    }

  }

}