Bom dia!
Considerem o exemplo abaixo:
while(false) {
//faz qualquer coisa
}
Isso aí nem compila pois é um trecho de código que nunca será executado. Mas reparem no código abaixo:
private void menuListaConta() {
int tipo = menuTipoConta("Listar Contas");
switch(tipo) {
case 1:
listaContaCorrente();
break;
case 2:
listaContaPoupanca();
break;
case 0:
return;
default:
System.out.println("Valor invalido. Tente novamente.");
}
}
private int menuTipoConta(String menuAtual) {
System.out.print(menuAtual + " - Digite o tipo de conta: (1)Conta corrente (2)Conta poupanca (0)Sair: ");
while(true) {
int tipo = leitor.leInteger(); // Método que só aceita valores inteiros do teclado e os retorna.
if((tipo == 1) || (tipo == 2) || (tipo == 0))
return tipo;
else
System.out.println("Valor invalido. Tente novamente.");
}
}
Notem que o default também nunca será executado.
Por que ele compila e executa sem problemas?
1 - while indica um trecho de código que irá se repetir ATÉ QUE a condição imposta torne-se falsa.
2 - switch/case/default indica trechos de código que irão ser executados de acordo com o valor do parâmetro passado.
Se eu tirar o default é considerado má prática de programação?
Obviamente você já deve ter ouvido ou lido (senão, logo irá) sobre “if bom é if morto”.
O teu código tem um if
Que não precisaria existir e, isso sim, é uma má prática.
Veja que a regra é redundante, você valida uma coisa e depois valida de novo no switch.
É uma opção tua, mas, o ideal é eliminar ifs que dependem de regras específicas.
É que “int tipo = leitor.leInteger()” recebe um valor qualquer inteiro, mas eu só quero 0, 1 ou 2. Então o método “menuTipoConta” só vai retornar um desses três valores. Depois, em “menuListaConta” eu trato adequadamente cada um dos três casos.
Qual seria o jeito mais adequado?
E, mantendo o default, trata os casos que não atenderem ao que espera.
Não sei se entendi bem, mas você sugere que eu não use “menuTipoConta”. Que eu faça a leitura direto dentro de “menuListaConta”? Só que aí eu vou ter que colocar um while(true) encapsulando o switch para que o usuário fique em loop até digitar um dos três valores válidos.
Eu pensei que você falava para eu usar algo como:
if(tipo >=0 && tipo <=2) {
return tipo;
}
Veja, eu não sei qual a tua necessidade, porém, eu não colocaria o if, sendo que você tem a validação no switch.
Apenas isso.
Minha necessidade é bem específica. Só isso que eu te disse. Vou fazer do jeito que você sugeriu então. Se é que eu entendi corretamente.
Sou novo em programação. Nesse caso eu estava encarando o if como validador e o switch como seletor.
O switch é uma adaptação do if, para evitar que você crie muitos ifs aninhados.