[RESOLVIDO] Otimização usando "do" e "case"

2 respostas
N

Estou buscando uma forma de deixar meu código mais otimizado para atualizações futuras, isso é só um estudo. Desenvolvi um menu.

A mensagem de texto está assim:

private int numeroMenu = 0;
    public void txtMenu() {
        System.out.println("Digite a opçcão");
        numeroMenu += 1;
        System.out.println(numeroMenu + " - opcao 1");
        numeroMenu += 1;
        System.out.println(numeroMenu + " - opcao 2 ");
        numeroMenu += 1;
        System.out.println(numeroMenu + " - opcao3");
        numeroMenu = 0;
    }

Ou seja se eu quiser adicionar uma opção futuramente entre a opção 2 e 3, eu não preciso alterar todo o texto a baixo para alterar os numero do println.

Entretanto esse menu está usando um do:

public void menu() {
    int opcaoMenu;
     Scanner sc = new Scanner(System.in);
   do {
        txtMenu();
        opcaoMenu = sc.nextInt();
        System.out.print("\n");
        switch (opcaoMenu) {

            case 1:
                metodo1();
                break;
            case 2:
                metodo4();
                break;
            case 3:
                metodo3();
                break;
            default:
                txtErro();
                break;
        }
    } while (opcaoMenu != 0);
}

}

há a possibilidade de implementar algo parecido, para caso eu queira adicionar um novo metodo, entre o 2 e o 3 eu não precisei alterar manualmente os “case” abaixo?

2 Respostas

A

Do jeito que está tentando fazer, mesmo que consiga deixa o switch case mais dinâmico, sempre que precisar adicionar uma nova opçao, teria que alterar o código em dois lugares, o que geralmente nao é desejável (é fácil esquecer de alterar um e criar bugs com isso).

O que você quer é associar um número (pro usuário selecionar), uma descriçao da opçao e um método a ser executado. Você pode criar uma classe para agrupar tudo isso, daí sempre que criar uma nova opçao, é garantido tudo é mudado junto, na mesma ordem.

Algo mais ou menos assim:

int opcaoMenu = 0;
    List<ItemMenu> menu = Arrays.asList(
      new ItemMenu(++opcaoMenu, "Opcao 1", SuaClasse::metodo1),
      new ItemMenu(++opcaoMenu, "Opcao 2", SuaClasse::metodo2),
      new ItemMenu(++opcaoMenu, "Opcao 3", SuaClasse::metodo3)
    );

Com isso, no seu método txtMenu você só precisa fazer um for na variável menu, imprimindo a opcao e o texto.

E depois pode trocar seu switch case por um for no menu, verificando se a opçao que o usuário digitou tem um número igual em algum item.

N

Obrigado, pelo esclarecimento.
Não tinha chegado aos estudos referente ao arrays list. mas irei focar nele agora.

Obrigado, mais uma vez.

Criado 4 de maio de 2019
Ultima resposta 7 de mai. de 2019
Respostas 2
Participantes 2