Encapsulamento
Getters, setters e controle de acesso
Encapsulamento significa esconder os detalhes internos de um objeto e expor apenas o necessário através de uma interface pública bem definida. Em Java, isso é feito tornando atributos private e criando métodos getters e setters públicos.
Mas encapsulamento vai além de getters/setters mecânicos: é sobre controlar o que pode mudar e validar as mudanças. Um setter pode verificar se o valor é válido antes de aceitar. Um getter pode retornar uma cópia defensiva para evitar que código externo modifique a coleção interna.
O benefício real é o desacoplamento: você pode mudar a implementação interna — como o tipo do campo, a lógica de cálculo ou o formato de armazenamento — sem quebrar nenhum código externo, desde que mantenha a mesma interface pública.
public class Temperatura {
private double celsius; // campo encapsulado
public Temperatura(double celsius) {
setCelsius(celsius); // usa o setter para validar
}
// Getter simples
public double getCelsius() {
return celsius;
}
// Getter derivado: converte sem campo extra
public double getFahrenheit() {
return celsius * 9.0 / 5.0 + 32;
}
public double getKelvin() {
return celsius + 273.15;
}
// Setter com validação
public void setCelsius(double celsius) {
if (celsius < -273.15) {
throw new IllegalArgumentException(
"Temperatura abaixo do zero absoluto!");
}
this.celsius = celsius;
}
}
Temperatura t = new Temperatura(25.0);
System.out.println(t.getCelsius()); // 25.0
System.out.println(t.getFahrenheit()); // 77.0
System.out.println(t.getKelvin()); // 298.15
// t.celsius = -500; // ❌ Erro de compilação: campo privateEm projetos reais, use Lombok (@Getter, @Setter, @Data) ou Java Records para evitar boilerplate. Mas entenda o que eles geram por baixo antes de usá-los.