Ejemplo

Constructores en acción 🎯

Sin constructor ❌

public class Circulo {
    public double radio;  // ❌ público

    public double calcularArea() {
        return Math.PI * radio * radio;
    }
}

public class Main {
    public static void main(String[] args) {
        Circulo c = new Circulo();
        c.radio = 5;  // 👎 cualquiera puede cambiar el radio

        System.out.println("Área: " + c.calcularArea());
    }
}

Con encapsulación ✅

public class Circulo {
    private double radio; // 👈 ahora es privado

    // Setter público para asignar valor
    public void setRadio(double radio) {
        this.radio = radio;
    }

    public double calcularArea() {
        return Math.PI * radio * radio;
    }
}

MAIN ✅

public class Main {
    public static void main(String[] args) {
        Circulo c = new Circulo();
        c.setRadio(5);  // ✅ se controla con un método
        System.out.println("Área: " + c.calcularArea());
    }
}

Con constructor 🚀

public class Circulo {
    private double radio;

    // Constructor → obliga a inicializar el radio
    public Circulo(double radio) {
        this.radio = radio;
    }

    public double calcularArea() {
        return Math.PI * radio * radio;
    }
}

MAIN ✅

public class Main {
    public static void main(String[] args) {
        Circulo c = new Circulo(5);  // 👈 más limpio
        System.out.println("Área: " + c.calcularArea());
    }
}

Con validación 🔒

public class Circulo {
    private double radio;

    // 👇 Constructor público
    public Circulo(double radio) {
        setRadio(radio);   // 👈 el constructor SÍ puede llamar al setter privado
    }

    // 👇 Setter privado (solo la clase lo puede usar)
    private void setRadio(double radio) {
        if (radio <= 0)
            throw new IllegalArgumentException("El radio debe ser positivo");
        this.radio = radio;
    }

    // 👇 Método público para usar desde fuera
    public double calcularArea() {
        return Math.PI * radio * radio;
    }

    // 👇 Getter público si quieres consultar el radio
    public double getRadio() {
        return radio;
    }
}

MAIN ✅

public class Main {
    public static void main(String[] args) {
        Circulo c1 = new Circulo(5); // ✅ pasa por el setter privado
        System.out.println("Radio: " + c1.getRadio());
        System.out.println("Área: " + c1.calcularArea());

        Circulo c2 = new Circulo(-3); // ❌ lanza excepción
    }
}

Resultado 🚀

Área: 78.53981633974483
Exception in thread "main" java.lang.IllegalArgumentException: El radio debe ser positivo