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 nome e idade declarados como private.
  • Getter getNome() e getIdade() públicos.
  • Setter setIdade(int) lança IllegalArgumentException se a idade for negativa.
  • O main cria uma Pessoa, 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

  1. Declaramos nome e idade como private, então código fora da classe não pode fazer p.idade = -5.
  2. 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.
  3. getNome() e getIdade() são os únicos caminhos de leitura; eles só devolvem o valor, sem expor nada mutável.
  4. setIdade verifica idade < 0 e lança IllegalArgumentException, impedindo que o objeto fique em estado inválido.
  5. No main, criamos uma Pessoa, 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; permite p.idade = -10; e o invariante quebra sem erro.
  • Esquecer de validar no construtor: se você fizer this.idade = idade; direto, pode criar uma Pessoa inválida.
  • Lançar Exception genérica em vez de IllegalArgumentException: 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