Constructores
Hasta ahora aprendimos dos principios:
Encapsulación: protegemos los datos con private.
Abstracción: ocultamos lo innecesario y dejamos solo lo esencial.
Pero aparece un problema:
Si ocultamos los setters (por ejemplo setTasaHoraria), ¿cómo inicializamos los valores de un objeto al crearlo? 🤔
## El problema ❌
public class Empleado {
private int salarioBase;
private int tasaHoraria;
// setter público
public void setSalarioBase(int salarioBase) {
this.salarioBase = salarioBase;
}
// setter privado → ya no se puede usar desde Main
private void setTasaHoraria(int tasaHoraria) {
this.tasaHoraria = tasaHoraria;
}
}public class Main {
public static void main(String[] args) {
Empleado e = new Empleado();
e.setSalarioBase(1000);
// e.setTasaHoraria(50); // ❌ ERROR: método privado
}
}El objeto queda incompleto, porque no podemos darle un valor a tasaHoraria.
La solución: Constructores ✅
Un constructor es un método especial que se ejecuta automáticamente al usar new.
Características:
Siempre tiene el mismo nombre de la clase.
No tiene tipo de retorno (ni
void).Se usa para inicializar valores obligatorios.
Metáfora:
Cuando un empleado entra a la empresa, no puede hacerlo sin contrato.
El constructor es ese contrato: define qué datos son mínimos e indispensables para que el objeto exista.
## Ejemplo de constructor
public class Empleado {
private int salarioBase;
private int tasaHoraria;
// 🔹 Constructor
public Empleado(int salarioBase, int tasaHoraria) {
setSalarioBase(salarioBase); // validación interna
setTasaHoraria(tasaHoraria); // validación interna
}
public int calcularSalario(int horasExtra) {
return salarioBase + (tasaHoraria * horasExtra);
}
private void setSalarioBase(int salarioBase) {
if (salarioBase <= 0)
throw new IllegalArgumentException("El salario no puede ser <= 0");
this.salarioBase = salarioBase;
}
private void setTasaHoraria(int tasaHoraria) {
if (tasaHoraria < 0)
throw new IllegalArgumentException("La tarifa no puede ser negativa");
this.tasaHoraria = tasaHoraria;
}
}## Main con constructor 🎉
public class Main {
public static void main(String[] args) {
// 👇 El empleado nace listo, con valores válidos
Empleado e = new Empleado(1000, 50);
int total = e.calcularSalario(10);
System.out.println("Salario con horas extra: " + total);
}
}👉 Ya no necesitamos usar varios setters. El objeto nace configurado y válido desde el inicio.
El constructor es un método especial que se ejecuta al crear un objeto con
new.Garantiza que el objeto nazca en un estado válido.
Hace que el código del
mainsea más simple y seguro.Encapsulación + Abstracción + Constructores → objetos bien diseñados.