[RESOLVIDO] Swith-case ou operador condicional ternário

Boa tarde. Acredito que o operador condicional ternário possa ter algum limitador, ou seja, algo que não seja possível e que o Switch-case seja. Eu fiz o código abaixo e achei o código mais limpo utilizando o operador ternário. Qual a opinião de vocês?

import javax.swing.JOptionPane;

public class Meses{

public static void main(String[] args) {

/* String st = “Informe um número entre 1 e 12”;
st = JOptionPane.showInputDialog(null,st);
byte mes = Byte.parseByte(st);

	switch(mes) {
	case 1:
		st = "Janeiro";
		break;
	case 2:
		st = "Fevereiro";
		break;
	case 3:
		st = "Março";
		break;
	case 4:
		st = "Abril";
		break;
	case 5:
		st = "Maio";
		break;
	case 6:
		st = "Junho";
		break;
	case 7:
		st = "Julho";
		break;
	case 8:
		st = "Agosto";
		break;
	case 9:
		st = "Setembro";
		break;
	case 10:
		st = "Outubro";
		break;
	case 11:
		st = "Novembro";
		break;
	case 12:
		st = "Dezembro";
		break;
	default:
		st = "Mês inválido!";
		JOptionPane.showMessageDialog(null, st, "Erro", 0);
		System.exit(0);
	}
	
	st = "Você escolheu o mês de " + st;
	JOptionPane.showMessageDialog(null, st, "Mensagem", 1);
	System.exit(0);

*/

	String st = "Informe um número entre 1 e 12";
	st = JOptionPane.showInputDialog(null,st);
	byte mes = Byte.parseByte(st);	
	
	JOptionPane.showMessageDialog(null, 
			mes == 1 ? "Janeiro" : 
			mes == 2 ? "Fevereiro" :	
			mes == 3 ? "Março" :
			mes == 4 ? "Abril" :			
			mes == 5 ? "Maio" :
			mes == 6 ? "Junho" :		
			mes == 7 ? "Julho" :
			mes == 8 ? "Agosto" :
			mes == 9 ? "Setembro" :
			mes == 10 ? "Outubro" :
			mes == 11 ? "Novembro" :	
			mes == 12 ? "Dezembro" :	
			"Mês inválido", "Mensagem",1); 

}

}

Você já usou o excel ou o calc do libreoffice?
Se sim, já usou a função se em algum deles?
O operador ternário é muito parecido com eles.
E, veja, seu uso é indicado quado você tem uma validação e duas possibilidades:

String retorno = pacoteRetorno.status() ? pacoteRetorno.retorno() : "";

Quando você tem mais opções, já fica uma coisa esquisita:

String diaPorExtenso = dia == 1 ? "Domingo" : dia == 2 ? "Segunda" : .... ;

Não fica?
Tendo o switch/case, a sintaxe fica mais legível, mais adequado e você não se preocupa se tem 10, 20 ou 200 possibilidades.

1 curtida

@C4sh3w exatamente isso que o @darlan_machado disse , para essa quantidade acredito que o ternário utilizaria até menos processamento, porem para mais opções o Switch case é a melhor escolha. a menos que você faça um estudo de probabilidade para dizer as tendencias e organizar o operador ternário em relação ao seu estudo.

Nesse exemplo, eu tive 12 possibilidades. 13 na verdade. Poderia também ter inúmeras… e achei mais legível o código. No exemplo do Switch-case, eu sou obrigado a declarar as instruções:
switch (só no início)
case (em todas as possibilidades)
break (em todas as possibilidades)
default (só no final)
Além de informar a variável quantas vezes for necessária verificar a instrução.

No operador ternário:
? em toda instrução
: em toda instrução
E a variável quantas vezes for necessária verificar a instrução

Logo, não se compara com a quantidade de código.

Fiquei curioso se debugando, o Java iria ler linha por linha, o que não aconteceu. Se eu (utilizando o operador ternário), digito 3, ele verifica até esse ponto e ignora os demais. Eu até pensei que o compilador iria continuar até o final, o que não ocorreu. Logo, vejo, até o momento que utilizar o operador ternário tem mais vantagens. Ainda estudando para entender melhor os conceitos.
Obrigado.

O operador ternário, nada mais é, que um if/else

int diaExtenso = dia == 1 ? "Domingo" : "Outro dia";

if(dia == 1) {
    diaExtendo = "Domingo";
} else {
    diaExtendo = "Outro dia";
}

Por isso a execução se dá linha a linha.
O switch/case tem um mecanismo mais otimizado, em que, se valida o elemento que atende ao requisito (a comparação do switch) e todos os elementos abaixo dele, desde que, não se encontre uma instrução de retorno.

2 curtidas

Essa é a vantagem! Acabei de debugar e ele só executa a linha de acordo com o critério e não uma a uma. Valeu.

1 curtida

Acrescentando. Se você tiver um switch assim

switch(mes) {
    case 1:
       System.out.println("Janeiro");
    case 2:
       System.out.println("Fevereiro");
    case 3:
       System.out.println("Março");
}

Ou seja, sem instrução de retorno/quebra, todas as linhas serão executadas.