Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Devo usar setters no construtor de um objeto ou atribuir os valores diretamente?

Olá, estou com uma dúvida.

Recentemente, assisti a uma aula do curso de Java, onde os professores ensinaram a utilizar construtores com encapsulamento, como no exemplo abaixo:

public Pessoa(String nome, int idade) {
    this.setNome(nome);
    this.setIdade(idade);
}

Para praticar, resolvi fazer alguns exercícios com vetores, utilizando o exemplo orientado a objetos acima:

System.out.print("Quantas pessoas você vai adicionar? ");
int tamanhoVetor = sc.nextInt();

Pessoa[] vetor = new Pessoa[tamanhoVetor];
for (int contador = 0; contador < vetor.length; contador++) {
    System.out.print("Dados da " + (contador + 1) + "ª pessoa: ");
    vetor[contador].setNome(sc.next());
    vetor[contador].setIdade(sc.nextInt());
}

Instanciei o vetor dessa forma, utilizando o encapsulamento, mas fiquei em dúvida se essa é uma boa prática. Quando pesquisei como instanciar um vetor orientado a objetos, encontrei uma abordagem diferente:

for (int contador = 0; contador < vetor.length; contador++) {
    System.out.println("Dados da " + (contador + 1) + "ª pessoa:");
    System.out.print("Nome: ");
    String nome = sc.next();
    System.out.print("Idade: ");
    int idade = sc.nextInt();

    vetor[contador] = new Pessoa(nome, idade);
}

No entanto, percebi que o construtor dessa segunda abordagem não utiliza encapsulamento, atribuindo os valores diretamente, como neste exemplo:

public Pessoa(String nome, int idade) {
    this.nome = nome;
    this.idade = idade;
}

Gostaria de saber: qual é a melhor prática neste caso?

1 resposta
solução!

Oi, Julia!

  1. Setters no construtor: Utilizar setNome() e setIdade() dentro do construtor, como no primeiro exemplo, é uma prática comum quando os setters possuem validações ou regras de negócio. Isso garante que qualquer lógica implementada nesses métodos seja executada ao criar o objeto, mantendo a consistência. No entanto, se os setters não têm validações, o uso direto dos campos pode ser mais eficiente.

  2. Atribuição direta: Atribuir os valores diretamente aos atributos, como no segundo exemplo, é mais comum e simples. Essa abordagem evita chamadas extras, o que pode ser um pouco mais performático. Vale lembrar que, ao não usar setters, qualquer regra de validação precisa ser implementada diretamente no construtor para evitar inconsistências.

Recomendação: Geralmente, se o setter possui validações, usá-lo no construtor é uma boa prática. Caso contrário, a atribuição direta pode ser uma escolha mais limpa. Se você planeja manter o encapsulamento, a segunda abordagem (com o vetor sendo inicializado via construtor) é mais elegante e facilita a leitura do código.