Constructores

Hasta ahora aprendimos dos principios:

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 main sea más simple y seguro.

  • Encapsulación + Abstracción + Constructores → objetos bien diseñados.