Esquece um pouco essa história de “boa prática”. O que existe é “o que faz mais sentido” em cada caso.
No seu exemplo, não faz tanta diferença, a não ser que criou uma variável a mais que parece desnecessária, então eu escolheria a primeira opção, por ser mais sucinta.
Um detalhe importante é que o return
não só retorna o valor, como também não executa mais nada dentro do método. Então faria diferença se tivesse mais coisas no meio. Ex:
public boolean addWine(int row, int column, Wine wine) {
if (validatePositions(row, column) && mat[row][column] != null) {
mat[row][column] = wine;
return true;
}
// faz mais coisas aqui
fazMaisCoisas();
return false;
}
Nesse caso, se entrar no if
, ele retorna e não executa o trecho que faz mais coisas (este trecho só executa se ele não entrar no if
).
Agora se for assim:
public boolean addWine(int row, int column, Wine wine) {
boolean flag = false;
if (validatePositions(row, column) && mat[row][column] != null) {
mat[row][column] = wine;
flag = true;
}
// faz mais coisas aqui
fazMaisCoisas();
return flag;
}
Aí o trecho que faz mais coisas sempre é executado (independente de entrar ou não no if
), já que o return
só é feito no final.
Então você teria que ver se quer executar essas coisas a mais sempre, ou só em determinadas condições.
Claro que o trecho que faz mais coisas pode ter seu funcionamento mudado de acordo com o valor da flag
, por exemplo, mas aí varia conforme o caso.
Enfim, eu gosto de retornar tão logo eu saiba que não é preciso executar mais nada. Tem gente que não. Mas tem que avaliar o todo pra saber se é pra retornar mesmo ou se ainda tem mais coisas pra fazer. Cada caso é um caso, não tem “a regra de ouro” (a tal da “boa prática”) pra isso.
Um exemplo “clássico”, verificar se determinado valor existe em um array:
// verifica se n existe no array
public boolean existe(int n, int[] valores) {
for (int v: valores) {
if (n == v) {
return true; // encontrei
}
}
return false;
}
Eu só quero ver se existe ou não, então se eu encontrar, já posso retornar true
(não tem porque continuar procurando se já encontrei).
Agora se fizer com flag:
// verifica se n existe no array
public boolean existe(int n, int[] valores) {
boolean achou = false;
for (int v: valores) {
if (n == v) {
achou = true; // encontrei
}
}
return achou;
}
Mesmo depois de achar, ele continua procurando, até o final do array, o que é mais ineficiente (pra não dizer “burro” - se já achou, pra que continuar procurando, se eu só quero saber se existe ou não?)
Mas claro que é só um exemplo. Como eu já disse, cada caso é um caso…