He leído en una reciente revisión de código que ambos ternary operator (condition ? foo : bar)
y los XOR operator ^
rara vez se usan en Java. ¿Es verdad?
En caso afirmativo, ¿es esto porque son menos legibles? o alguna otra razón.
He leído en una reciente revisión de código que ambos ternary operator (condition ? foo : bar)
y los XOR operator ^
rara vez se usan en Java. ¿Es verdad?
En caso afirmativo, ¿es esto porque son menos legibles? o alguna otra razón.
Respuestas:
El operador ternario se utiliza bien, especialmente para verificaciones nulas cortas / valores predeterminados:
System.out.println("foo is "+(foo==null) ? "not set" : foo);
Algunas personas consideran que esto no es tan legible como un if / else, pero esa no era la pregunta.
El operador XOR bitwise solo se usa en el procesamiento de bits. Si necesita un XOR bit a bit, entonces no hay forma de evitarlo.
El operador lógico XOR es realmente tan raro, que no lo vi en los últimos diez años en Java en casos válidos . Esto también se debe al hecho de que el XOR booleano "no escala" como ||
o &&
. Lo que quiero decir:
if( a && b && c && d ) .... // it's clear what the intention is
if( a || b || c || d ) .... // here also
if( a ^ b ^ c ^ d ) .... // ???
Supongo que en el último caso, el codificador quería decir "solo uno debería ser cierto". Pero XOR es una bestia. El codificador consiguió la bestia y no lo que quería.
Esa sería una pregunta interesante para la entrevista: ¿Cuál es el resultado de la última if
?
!=
booleanos un par de veces, y el XOR lógico nunca se me pasó por la cabeza.
Solía encontrar el operador ternario difícil de analizar, pero desde entonces descubrí que hay algunos lugares donde es muy útil. Estos no tienden a ser la lógica de la aplicación, sino el registro.
Por ejemplo:
log.info( "Object foo is " + ( foo.isEnabled() ? "" : "not " ) + "enabled" );
Para mí, eso es mucho más ordenado que cualquiera
if ( foo.isEnabled() )
log.info( "Foo is enabled" );
else
log.info( "Foo is not enabled" );
O
log.info( "Foo is enabled : " + foo.isEnabled() );
En resumen, se trata de dónde se está utilizando y para qué.
En cuanto a los bits, aún lucho con ellos, pero eso es porque estoy acostumbrado a trabajar en un alto nivel de abstracción, como han sugerido otros comentaristas. Si encuentro en algún lugar del código que alguien decidió usar eso para ser "eficiente", el tiempo perdido mientras lo descubro niega los beneficios.
foo.setParam( bool ? ClassA.method() : ClassB.method )
. Funciona, pero es un poco oloroso, en mi opinión.
unless ( !bool ) {
. :)
Esta es más una respuesta basada en una opinión, pero en mi caso:
De hecho, por alguna razón, encuentro que el operador ternario es menos legible que una construcción if-else.
En cuanto a XOR, probablemente la mayoría de los programas Java no tienen uso para tales manipulaciones bit a nivel bajo. En su mayor parte, parece ser solo una reliquia heredada de C.