Historia de la pregunta:
En Java, el concepto de llamada a un constructor desde otro (constructor chaining) surgió como una necesidad de gestionar de manera más flexible la inicialización de objetos, evitando la duplicación de código. Permite vincular constructores dentro de una misma clase o en cadena a través de la jerarquía de herencia.
Problema:
Al diseñar clases complejas con muchos parámetros, resulta incómodo y poco eficiente copiar la lógica de inicialización en cada constructor. Esto lleva a la duplicación de código, errores y reduce la mantenibilidad del sistema.
Solución:
En Java, se puede llamar a un constructor desde otro utilizando la palabra clave this() para el constructor de la misma clase y super() para el constructor de la clase padre. Esto permite centralizar la lógica de inicialización, aumentar la legibilidad y reducir la probabilidad de errores.
Ejemplo de código:
public class Person { private String name; private int age; public Person(String name) { this(name, 0); // llamada a otro constructor } public Person(String name, int age) { this.name = name; this.age = age; } }
Características clave:
this() debe ser la primera línea en el constructorsuper()¿Se puede llamar a un constructor que no sea la primera línea del constructor?
No. La llamada this() o super() siempre debe ser la primera línea del constructor, de lo contrario, el código no se compilará.
¿Qué pasará si no se llama explícitamente a super() en el constructor del heredero?
En este caso, Java agrega automáticamente una llamada al constructor sin argumentos de la clase padre. Si no existe dicho constructor, el programa no compilará.
Ejemplo de código:
class Base { public Base(int x) {} } class Derived extends Base { public Derived() {} // ¡Error! No hay constructor Base() sin parámetros }
¿Cuántas veces se puede llamar a this() en un mismo constructor?
Exactamente una vez y solo como la primera línea. Una llamada repetida o no inicial provocará un error de compilación.
Un programador copia la misma inicialización en cada constructor de la clase; al cambiar la lógica, debe recordar modificar todos los constructores.
Pros:
Contras:
Un programador utiliza el constructor con la mayor cantidad de parámetros como principal y los demás se lo delegan a través de this() — la lógica está centralizada.
Pros:
Contras: