Quando utilizar void ou retornar um objeto?

Existe alguma regra de boas maneiras que indique qual deva ser a melhor opção? Por exemplo, tenho um método que preenche um dos atributos da entidade Pessoa, poderia ser dessas duas formas:

public void preencherNome(Pessoa pessoa) {
   pessoa.setNome(regra);
}

ou

public Pessoa preencherNome(Pessoa pessoa) {
   pessoa.setNome(regra);

   return pessoa;
}

Qual deveria utilizar? A que retorna o mesmo objeto já preenchido, ou a que preenche o objeto em memória?

As duas preenchem o objeto passado por parâmetro.
Mas uma não retorna nada e a outra retorna o próprio parâmetro.
Utilize aquela que melhor atender sua necessidade.

2 curtidas

Eu vou mais fundo um pouco!

As duas maneiras são ruins já visto que Pessoa consequentemente deve ter setNome então não precisa desse método só para fazer isso …

Os exemplos são ruim, talvez, você precisa fazer algo quase igual, semelhante, mas, que tenha um contexto e fundamento dito.

Desse jeito que está não precisa, um void e outro retorno de tipo tudo vai depender do que é necessário e também saber o que está fazendo.

Tem um exemplo mais real ou é isso mesmo? (geralmente o pessoal nunca coloca o exemplo que deve ser colocado)

2 curtidas

Nesse caso eu daria preferência a versão com void.

Retornando o objeto pessoa você pode gerar dúvidas para o chamador dessa função. Qual seria a forma de usar isso? A pessoa retornada é sempre a mesma pessoa passada como parâmetro?
O certo é usar a pessoa retornada pelo método ou usar a mesma pessoa passada para função?
Com sua implementação, tanto faz, mas isso gera uma dúvida desnecessária a quem usa seu código.

Esse estilo é geralmente usado quando você faz encadeamento de método, mas nesses casos você não passa o próprio objeto da cadeia por parâmetro.

3 curtidas

Ótima colocação!
Eu por exemplo tenho o hábito de fazer meus setters retornarem a instância da própria classe, para fazer chamadas encadeadas ao inicializar objetos.
Isso quando eu não crio um builder… Mas cada caso, é um caso.

Não estou com esse problema, apenas surgiu a dúvida, por isso fiz esse exemplo tão simples e feinho, mas acredito que um exemplo melhor seria da seguinte forma:

Existe uma entidade chamada Estudo, onde temos várias informações, incluindo uma lista de valores para esse estudo.

Em determinado momento na camada de negócios precisamos fazer o cálculo desses valores, onde teremos várias situações a ser analisadas.

Nesse caso, qual seria o melhor uso, retornar o estudo com a lista de valores já calculados, ou carregar no objeto a lista de valores?

Encadeamento de método é exatamente o que o builder faz? por exemplo:

new ItemBuilder().comNome("Lápis").comTamanho(2).build() ?

Faz o que for mais simples pra atender o requisito. Mas acho que não deveria preencher e não retornar isso da entidade, faz isso na classe de negócio.

1 curtida

Ele não faz, ele permite que você faça, pois cada método withAlgumaCoisa retorna uma referência ao próprio builder.

Costumo colocar um método como esse que vc exemplificou dentro da propria classe e sem retorno.

public class Pessoa {
    // ...
    public void preencherNome(String nome) {
        this.nome = nome;
    }
}