Fácil Java
Encapsulando uma Pessoa
Enunciado
Crie uma classe Pessoa com os atributos nome (String) e idade (int), ambos privados. Exponha getters e um setter de idade que rejeite valores negativos lançando IllegalArgumentException.
Requisitos
- Atributos
nomeeidadedeclarados comoprivate. - Getter
getNome()egetIdade()públicos. - Setter
setIdade(int)lançaIllegalArgumentExceptionse a idade for negativa. - O
maincria umaPessoa, altera a idade e imprime nome e idade.
Código inicial
public class Pessoa {
// TODO: declare os atributos como private
// TODO: construtor, getters e setter com validação
public static void main(String[] args) {
Pessoa p = new Pessoa("Bia", 20);
p.setIdade(21);
System.out.println(p.getNome() + " tem " + p.getIdade() + " anos");
}
}
Saída esperada
Bia tem 21 anos
Ver dica
Use if (idade < 0) throw new IllegalArgumentException("idade inválida"); dentro do setter.
Mostrar solução
public class Pessoa {
private String nome; // encapsulado: ninguém altera direto
private int idade; // encapsulado: só via setter validado
public Pessoa(String nome, int idade) {
this.nome = nome;
setIdade(idade); // reutiliza a validação do setter
}
public String getNome() { return nome; }
public int getIdade() { return idade; }
public void setIdade(int idade) {
if (idade < 0) {
throw new IllegalArgumentException("idade não pode ser negativa");
}
this.idade = idade;
}
public static void main(String[] args) {
Pessoa p = new Pessoa("Bia", 20);
p.setIdade(21);
System.out.println(p.getNome() + " tem " + p.getIdade() + " anos");
}
}
Passo a passo
- Declaramos
nomeeidadecomoprivate, então código fora da classe não pode fazerp.idade = -5. - O construtor recebe os valores iniciais e chama
setIdade(idade)em vez de atribuir direto — assim a validação vale também na construção. getNome()egetIdade()são os únicos caminhos de leitura; eles só devolvem o valor, sem expor nada mutável.setIdadeverificaidade < 0e lançaIllegalArgumentException, impedindo que o objeto fique em estado inválido.- No
main, criamos umaPessoa, mudamos a idade para 21 e imprimimos o resultado.
Por que funciona
Encapsular significa controlar quem pode mudar o estado. Como idade é private, toda alteração passa pelo setter, que é o único lugar onde a regra "idade não pode ser negativa" é aplicada. Isso mantém o invariante da classe verdadeiro o tempo todo.
Erros comuns
- Deixar o atributo
public:public int idade;permitep.idade = -10;e o invariante quebra sem erro. - Esquecer de validar no construtor: se você fizer
this.idade = idade;direto, pode criar umaPessoainválida. - Lançar
Exceptiongenérica em vez deIllegalArgumentException: funciona, mas perde a semântica de "argumento inválido".
Outra forma de resolver
Se a idade nunca precisar mudar, torne-a private final e remova o setter — a classe fica imutável:
private final int idade;
Saída esperada
Bia tem 21 anos