Como podem perceber na imagem existe um IF com seus ELSE IF que tem o objetivo saber qual eh o parametro passado para aplicacao pelo metodo Main. Minha duvida eh se existe um outra maneira de fazer isso sem precisar fazer esses IF, ELSE IF
Eu pensei em usar um ENUM, porem acontece que quando vou dar o nome dos “valores”, nao posso colocar o valor inteiro ou uma string direto, sem que esteja numa variavel. Acho que a imagem explica melhor, segue ela abaixo.
Por favor se tiverem alguma ideia, sera muito bem vinda. Voces acham que tem como fazer de um jeito melhor que um monte de IFs ou não tenho escolha?
public static void opcao(String opcao){
switch(opcao){
case "1":
System.out.println("1");
break;
case "2":
System.out.println("2");
break;
case "3":
System.out.println("3");
break;
case "4":
System.out.println("4");
break;
case "5":
System.out.println("5");
break;
case "6":
System.out.println("6");
break;
case "7":
System.out.println("7");
break;
case "8":
System.out.println("8");
break;
default:
System.out.println("9");
}
}
E chamar o método no main dessa forma:
opcao(listaArgumentos.get(0));
Você acha que ficaria ruim usar com switch/case?
Também da para fazer usando o operador ternário, que é uma forma mais compacta de um if-else
A sintaxe do operador ternário é: (Expressão) ? ValorTrue : ValorFalse
List<String> _args = Arrays.asList(args);
//Verificando a existente de algum item no array
if (_args.isEmpty() == false)
{
String _item = _args.get(0);
//Verificando com essa classe se o número é corresponde de 0 a 9
//Se for diferente de número dá como argumento inválido
Pattern _pattern = Pattern.compile("^[0-9]");
if (_pattern.matcher(_item).matches())
{
int _num = Integer.parseInt(_item);
if (_num >= 0 && _num <=9)
{
System.out.println(_num);
}
}
else
{
System.out.println("Argumento é inválido");
}
}
Uma dúvida: Qual a necessidade de transformar args de String[] para List<String>? Você poderia fazer algo assim:
if ( args.length > 0 ) {
if ( args[0].equals("1") )
/* e assim por diante... Não ficaria mais limpo assim? */
}
Enfim, tive uma idéia para uma possível alternativa para você:
public class Main {
/*
* Primeiro criamos uma interface funcional aqui
*/
interface Action { void run(); }
/*
* O segredo está no uso deste Map
*/
private static Map<String, Action> actions = new HashMap<>();
static {
/*
* Aqui eu uso o for para percorrer do 1 até o 9.
* Mas eu fiz isso apenas por que minha Action apenas imprime alguma coisa
* Se deseja que sua Action realize tarefas mais complexas, tu vai ter que inserir
* os valores de um em um, ok?
*
* actions.put( "1", () -> { faz uma tarefa complexa aqui } );
* actions.put( "2", () -> { faz uma tarefa complexa aqui } );
* actions.put( "3", () -> { faz uma tarefa complexa aqui } );
* e assim por diante...
*/
for (int i = 1; i <= 9; i++) {
final String num = String.valueOf( i );
actions.put( num, () -> { System.out.println( num ); } );
}
}
public static void main(String[] args) {
/*
* Aqui eu uso for para verificar todo o conteudo de args
*/
for (String arg: args)
actions.get( arg ).run();
/*
* Mas se quiser apenas o conteúdo reference a posição 0 de args, você pode fazer isso:
*/
if (actions.containsKey( args[0] ) ) actions.get( args[0] ).run();
}
}
Pessoal muito obrigado pelas respostas, agora respondendo as perguntas não eh que eu acho que fique ruim com o switch/case, o problema que como irei executar uma aplicação diversa vezes por um arquivo .bat, achei que seria mais interessante usar outra maneira, ao invés de ficar fazendo diversos ifs/else.
Em relação a outra pergunta de porque estou transformando String[] em List, eh pelo acesso a outros métodos que não tem disponíveis com o String[].