Argumentos Metodo Main

Boa noite pessoal,

Segue o código que tenho duvida, parece simples, na verdade eh bem simples, a pergunta segue apos a imagem abaixo.

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?

Obrigado a todos

1 curtida

Você pode criar um switch/case.

switch (variável) {
	case valor:
		Código a ser executado caso o valor de case seja o mesmo da variável switch
}

Mas alem do switch/case, teria uma outra solução para esse problema?

Obrigado

Não deu certo usando switch/case?

Dá para montar o método opcao assim:

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

No seu caso ficaria assim:

String a;
a = (listaArgumentos.get(0).equals("1") == true) ? "1" :
		(listaArgumentos.get(0).equals("2") == true) ? "2" :
			(listaArgumentos.get(0).equals("3") == true) ? "3" :
				(listaArgumentos.get(0).equals("4") == true) ? "4" :
					(listaArgumentos.get(0).equals("5") == true) ? "5" :
						(listaArgumentos.get(0).equals("6") == true) ? "6" :
							(listaArgumentos.get(0).equals("7") == true) ? "7" :
								(listaArgumentos.get(0).equals("8") == true) ? "8" : "9";

Agora você ve ai qual forma seria melhor para o seu código.
Qualquer coisa estamos ai.

1 curtida

Refatoração do código

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");
	}
}

DEMO

1 curtida

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();
    }
}
1 curtida

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[].

Obrigado a todos pela resposta.

2 curtidas

Pessoal estive pensando e achei uma outra solução.

1 curtida

Gostei da solução. Precisei ficar alguns minutos olhando pra entender, mas parece funcionar.

Só acho o uso de enum um pouco exagerado para uma tarefa simples, já achei demais eu criar uma interface e um HashMap.

Mas é legal ver as alternativas!

1 curtida