O que é o encadeamento de construtores?

Um construtor em Java é um método específico usado na criação de objetos de uma classe. O construtor é invocado toda vez que um objeto da classe é criado. Ele pode ser usado para atribuir valores às propriedades do objeto no momento da criação. Pode haver vários construtores em uma classe Java com diferentes listas de parâmetros. O encadeamento de construtores é usado para invocar diferentes implementações de construtores da mesma classe/classe pai no momento da criação do objeto.

Como o encadeamento do construtor é implementado em Java?

Existem duas maneiras de encadear construtores com base em como chamar o construtor. Eles são os seguintes.
  • usando a palavra-chave this() – para chamar construtores da mesma classe
  • usando a palavra-chave super() – para chamar construtores da classe pai
Isso é explicado nos exemplos a seguir.Encadeamento de Construtores em Java - 1

Exemplo de encadeamento de construtores nº 1 – Construtores são encadeados usando a palavra-chave this()

Declaramos quatro construtores para DerivedClass. Um sem argumentos e os outros três com argumentos diferentes. Dentro de cada construtor, a palavra-chave this() é usada para chamar o próximo construtor da mesma classe.

package com.tutorialwriting.constchaining;
 
public class DerivedClass{
 
    String firstName;
    String country;
    int age;
 
    public DerivedClass() {
        // calling one argument constructor
        this("Maggie");
    }
 
    public DerivedClass(String firstName) {
        // calling two argument constructor
        this(firstName, 15);
    }
 
    public DerivedClass(String firstName, int age) {
        // calling three argument constructor
        this(firstName, age, "Australia");
    }
 
    public DerivedClass(String firstName, int age, String country) {
        this.firstName = firstName;
        this.age = age;
        this.country = country;
    }
 
    void displayValues() {
        System.out.println("First Name : " + firstName);
        System.out.println("Country : " + country);
        System.out.println("Age : " + age);
    }
 
    public static void main(String args[]) {
        DerivedClass object = new DerivedClass();
        object.displayValues();
    }
}
A saída da execuçãoEncadeamento de Construtores em Java - 2

Exemplo de encadeamento de construtores nº 2 – Construtores são encadeados usando a palavra-chave super()

Aqui, a classe filha chama os construtores da classe pai usando a palavra-chave super() . A BaseClass tem três construtores. O construtor sem argumentos chama um dos construtores de três argumentos da BaseClass usando this() .

package com.tutorialwriting.constchaining;
 
public class BaseClass {
 
    public BaseClass() {
        //calling a three argument constructor of the same class
        this("Male", "English", "1989/11/10");
        System.out.println("I'm executed third!!!");
    }
 
    public BaseClass(String firstName, String surname, int idNo) {
        System.out.println("I'm executed first!");
        System.out.println("First name : " + firstName);
        System.out.println("Surname : " + surname);
        System.out.println("ID Number : " + idNo);
    }
 
    public BaseClass(String gender, String nationality, String birthDate) {
        System.out.println("I'm executed second!!");
        System.out.println("Gender : " + gender);
        System.out.println("Nationality : " + nationality);
        System.out.println("Birth Date : " + birthDate);
    }
 
}
A DerivedClass tem dois construtores, cada um chamando os diferentes construtores da superclasse usando super() .

package com.tutorialwriting.constchaining;
 
public class DerivedClass extends BaseClass {
 
    public DerivedClass() {
        //calling no argument constructor of the super class
        super();
    }
 
    public DerivedClass(String firstName, String surname, int idNo) {
        //calling three argument constructor of the super class
        super(firstName, surname, idNo);
    }
 
    public static void main(String args[]) {
        DerivedClass object2 = new DerivedClass("Paul", "Wilson", 123456);
        DerivedClass object1 = new DerivedClass();
    }
}
A saída da execuçãoEncadeamento de construtores em Java - 3

Chamada de construtor implícita x explícita

Java tem duas maneiras diferentes de chamar construtores: chamada implícita e chamada explícita.
  • A chamada explícita refere-se a chamar construtores explicitamente no código usando this() ou super() .
  • A chamada implícita refere-se à chamada do construtor sem argumentos da superclasse implicitamente na ausência de tal chamada explícita do construtor da classe filha. Em outras palavras, o compilador adiciona a chamada super() como a primeira linha de qualquer um dos construtores das classes filhas se o programador explicitamente não chamar super() no código.

Por que precisamos do encadeamento de construtores?

Existem vários propósitos diferentes de ter uma cadeia de construtores em Java, conforme listado abaixo.
  • É uma maneira de acessar as propriedades de outros construtores ou propriedades de classes pai.
  • Ao chamar outros construtores, apenas um objeto está sendo usado, que é a instância atual da classe. A inicialização acontece em um só lugar, mas temos o privilégio de chamar diferentes implementações de construtor por meio de uma cadeia. Isso ajuda muito no gerenciamento de memória e na manutenção do código.

Conclusão

Neste tutorial, discutimos o encadeamento de construtores em Java. Os construtores são segmentos de código semelhantes a métodos que são invocados durante a criação de objetos. Uma classe Java pode ter qualquer número de construtores com diferentes listas de parâmetros. O encadeamento de construtores é uma maneira prática de lidar com diferentes inicializações com uma instância de uma classe. Alguns pontos importantes a serem observados neste tutorial estão listados abaixo.
  • Se o programador não o adicionar explicitamente ao código, o compilador adicionará um construtor público sem argumentos à classe Java. Isso é chamado de construtor padrão.
  • this() e super() devem ser escritos como a primeira linha do construtor.
  • this() é usado para chamar construtores da mesma classe enquanto super() é usado para chamar construtores da superclasse imediata.
  • Deve haver pelo menos um construtor dentro da classe que não contenha a palavra-chave this() .
  • Se não for adicionado explicitamente, o compilador adiciona uma chamada super() sem argumentos a cada construtor de classe filho. Isso ajudará a instanciar as classes corretamente.