Eu li em uma recente revisão de código que ambos ternary operator (condition ? foo : bar)
e o XOR operator ^
raramente são usados em Java. É verdade?
Se sim, é porque são menos legíveis? ou algum outro motivo.
Eu li em uma recente revisão de código que ambos ternary operator (condition ? foo : bar)
e o XOR operator ^
raramente são usados em Java. É verdade?
Se sim, é porque são menos legíveis? ou algum outro motivo.
Respostas:
O operador ternário é bem usado, especialmente para verificações / padrões curtos de nulidade:
System.out.println("foo is "+(foo==null) ? "not set" : foo);
Algumas pessoas consideram isso não tão legível quanto um if / else, mas essa não era a questão.
O operador XOR bit a bit é usado apenas no processamento de bits. Se você precisar de um XOR bit a bit, não há como contorná-lo.
O operador lógico XOR é realmente tão raro, que eu não o vi nos últimos dez anos em Java em casos válidos . Isso também se deve ao fato de o XOR booleano "não escalar" como ||
ou &&
. O que eu quero dizer:
if( a && b && c && d ) .... // it's clear what the intention is
if( a || b || c || d ) .... // here also
if( a ^ b ^ c ^ d ) .... // ???
No último caso, acho que o codificador significava "apenas um deveria ser verdadeiro". Mas XOR é uma fera. O codificador pegou a fera e não o que queria.
Essa seria uma pergunta interessante da entrevista: qual é o resultado da última if
?
!=
booleanos algumas vezes, e o XOR lógico nunca passou pela minha cabeça.
Eu costumava achar o operador ternário difícil de analisar, mas desde então descobri que há alguns lugares onde é muito útil. Estes não tendem a ser a lógica do aplicativo, mas o log.
Por exemplo:
log.info( "Object foo is " + ( foo.isEnabled() ? "" : "not " ) + "enabled" );
Para mim, isso é muito melhor do que qualquer um
if ( foo.isEnabled() )
log.info( "Foo is enabled" );
else
log.info( "Foo is not enabled" );
Ou
log.info( "Foo is enabled : " + foo.isEnabled() );
Em resumo, é uma questão de onde está sendo usado e para isso.
Quanto aos bits, ainda luto com eles, mas é porque estou acostumado a trabalhar em um alto nível de abstração, como outros comentaristas sugeriram. Se eu me deparar com algum código que alguém decidiu usar para ser "eficiente", o tempo perdido enquanto eu descobri isso nega benefícios.
foo.setParam( bool ? ClassA.method() : ClassB.method )
. Funciona, mas é um pouco de cheiro, IMO.
unless ( !bool ) {
. :)
Esta é mais uma resposta baseada em opinião, mas no meu caso:
De fato, por alguma razão, acho o operador ternário menos legível do que uma construção if-else.
Quanto ao XOR, provavelmente a maioria dos programas Java não tem utilidade para manipulações bit a bit de baixo nível. Na maioria das vezes, parece ser apenas uma relíquia herdada de C.