Este artigo tem como objetivo apresentar com detalhes e exemplos a utilização adequada de construtores na linguagem Java. Muitos podem ver este assunto como algo “banal”, devido a sua simplicidade, mas é algo que todos deveriam conhecer. A questão é que principalmente os iniciantes não utilizam de forma adequada os construtores, muita das vezes por falta de conhecimento. Este artigo também é aplicado à profissionais que vieram de uma outra linguagem e estão iniciando em Java.

Construtores

Também conhecidos pelo inglês constructors, os construtores são os responsáveis por criar o objeto em memória, ou seja, instanciar a classe que foi definida. Eles são obrigatórios e são declarados conforme a Listagem 1.

Nota: Em Java apenas as Interfaces não possuem construtores.

Listagem 1. Declaração de Construtores

 
 public class Carro{
 
 /* CONSTRUTOR DA CLASSE Carro  */
 public Carro(){
   //Faça o que desejar na construção do objeto
 }
 
 }

O construtor sempre tem a seguinte assinatura:

modificadores de acesso (public nesse caso) + nome da classe (Carro nesse caso) + parâmetros (nenhum definido neste caso). O construtor pode ter níveis como: public, private ou protected.

Porém, por que alguém colocaria um construtor private, para que assim ninguém pudesse instanciar essa classe? Um dos motivos é a aplicação do padrão de projeto Singleton, que controla se um objeto já foi ou não criado. Para que isso ocorra ele não pode deixar que ninguém chame diretamente o construtor da classe.

Para criar um objeto da classe Carro simplesmente usamos a palavra reservada “new” e o nosso construtor é chamado, como mostra o exemplo da Listagem 2.

Listagem 2. Chamando Construtor da Classe Carro

 public class Carro{
 
 /* CONSTRUTOR DA CLASSE Carro  */
 public Carro(){
   //Faça o que desejar na construção do objeto
 }
 
 }
 
 public class Aplicacao {
 
 
 public static void main(String[] args) { 
             //Chamamos o construtor sem nenhum parâmetro
 Carro fiat = new Carro(); 
 }
 
 }

Por padrão, o Java já cria esse construtor sem parâmetros para todas as classes, então você não precisa fazer isso se utilizará apenas construtores sem parâmetros. Por outro lado, se você quiser, poderá criar mais de um construtor para uma mesma classe. Ou seja, posso criar um construtor sem parâmetros, com dois parâmetros e outro com três parâmetros, como vemos no exemplo da Listagem 3.

Listagem 3: Definindo vários construtores

 public class Carro{
 
 private String cor;
 private double preco;
 private String modelo;
 
 /* CONSTRUTOR PADRÃO */
 public Carro(){
 
 }
 
 /* CONSTRUTOR COM 2 PARÂMETROS */
 public Carro(String modelo, double preco){
    //Se for escolhido o construtor sem a COR do veículo
    // definimos a cor padrão como sendo PRETA
    this.cor = “PRETA”;
    this.modelo = modelo;
    this.preco = preco;   
 }
 
 /* CONSTRUTOR COM 3 PARÂMETROS */
 public Carro(String cor, String modelo, double preco){
    this.cor = cor;
    this.modelo = modelo;
    this.preco = preco;
 }
 
 }

Temos agora três construtores padrões, ou seja, podemos criar um novo Carro sem definir sua Cor, ou podemos criar um novo carro definindo todos os seus atributos, como no exemplo da Listagem 4.

Listagem 4. Criando vários carros com diferentes construtores

 public class Carro{
 
 private String cor;
 private double preco;
 private String modelo;
 
 /* CONSTRUTOR PADRÃO */
 public Carro(){
 
 }
 
 /* CONSTRUTOR COM 2 PARÂMETROS */
 public Carro(String modelo, double preco){
    //Se for escolhido o construtor sem a COR do veículo
    // definimos a cor padrão como sendo PRETA
    this.cor = “PRETA”;
    this.modelo = modelo;
    this.preco = preco;   
 }
 
 /* CONSTRUTOR COM 3 PARÂMETROS */
 public Carro(String cor, String modelo, double preco){
    this.cor = cor;
    this.modelo = modelo;
    this.preco = preco;
 }
 
 }
 
 public class Aplicacao {
 
 
 public static void main(String[] args) { 
                     //Construtor sem parâmetros
 Carro prototipoDeCarro = new Carro(); 
 
 //Construtor com 2 parâmetros
                     Carro civicPreto = new Carro(“New Civic”,”40000”);
 
                     //Construtor com 3 parâmetros
                     Carro golfAmarelo = new Carro(“Golf”, “38000”);
 }
 
 }

Você também pode utilizar construtores da classe pai com a palavra reservada “super()”. Assim, dentro do seu construtor chamamos o construtor da classe Pai, como mostra a Listagem 5.

Listagem 5. Usando Construtor da Classe Pai

 public class Carro{
 
 private String cor;
 private double preco;
 private String modelo;
 
 /* CONSTRUTOR PADRÃO */
 public Carro(){
 
 }
 
 /* CONSTRUTOR COM 2 PARÂMETROS */
 public Carro(String modelo, double preco){
    //Se for escolhido o construtor sem a COR do veículo
    // definimos a cor padrão como sendo PRETA
    this.cor = “PRETA”;
    this.modelo = modelo;
    this.preco = preco;   
 }
 
 /* CONSTRUTOR COM 3 PARÂMETROS */
 public Carro(String cor, String modelo, double preco){
    this.cor = cor;
    this.modelo = modelo;
    this.preco = preco;
 }
 
 }
 
 public class Honda extends Carro{
 
   private String motor;
 
   /* CONSTRUTOR PADRÃO */
   public Honda(){
      
  }
 
 /* CONSTRUTOR COM PARÂMETROS */
 public Honda(String motor, String modelo, double preco){
   super(modelo, preco);
    this.motor = motor;
 }
 
 }
 
 public class Aplicacao {
 
 
 public static void main(String[] args) { 
                     //Construtor sem parâmetros
 Honda hondaFitPreto = new Honda(“2.0 Flex”, “Honda Accord”, “60000”); 
 }
 
 }

Perceba que dentro do construtor da Classe Honda fazemos uma chamada ao Construtor de dois parâmetros da classe pai (Carro).

Destrutores

Não existe o conceito de destrutores em Java, mas você nem precisa se preocupar com isto, pois não tem como literalmente destruir um objeto, assim como você faz em C/C++. Isso porque não é garantido que o Garbage Collection irá destruir este objeto, já que ele o faz na hora que achar conveniente e o programador não tem nenhum controle sobre isso.

A forma mais adequada de “tentar” destruir um objeto em Java é atribuir valores nulos a ele. Assim, quando o Garbage Collection for realizar o seu trabalho, verá que seu objeto não está sendo mais utilizado e o destruirá.

Os conceitos ministrados neste artigo são básicos, porém essenciais. Sem eles é difícil, se não impossível, entender outros conceitos mais complexos, principalmente para aqueles que migraram de uma outra linguagem e que ainda não estão familiarizados com a ausência dos destrutores em Java.