ternario operador condicionales anidado java conditional-operator

condicionales - ¿Se puede utilizar el operador ternario/condicional de Java(?:) para llamar a métodos en lugar de asignar valores?



operador ternario php (3)

El operador ternario (condicional) devuelve un valor. Si sus métodos no lo hacen, no pueden utilizarse como partes del operador (donde toma el valor).

Para entenderlo mejor, pensemos en un operador binario simple: + . Funciona de esta manera:

<eval1> + <eval2> --> <value>

Necesita de 2 partes evaluables, y devuelve otra. Si escribiste

doThis() + doThat();

o incluso

gimmeAValue = doThis() + doThat();

fallaría, ya que ni doThis() ni doThat() evalúan nada ("devuelven" el void ). Por supuesto, tanto <eval1> como <eval2> deben ser de algún tipo "compatible" para que el operador + pueda manejarlos y devolver un valor de algún tipo.

Ahora veamos el operador ternario:

<evalBoolean> ? <eval1> : <eval2> --> <value>

Toma 3 partes evaluables, y devuelve un valor.

La primera parte evaluable debe ser comprensible (convertible) por el compilador como un valor booleano. Se utilizará para decidir cuál de las otras 2 partes evaluables debe devolverse.

Las otras dos partes evaluables deben ser, bueno ... evaluables. A algo. De algún tipo.

En otras palabras: el operador condicional ternario está destinado a devolver algo, no como bifurcación de código. Utilizado de esta manera:

gimmeAValue = testMe() ? returnThis() : returnThat();

En páginas como http://en.wikipedia.org/wiki/?: el operador ternario / condicional ?: Parece ser usado para asignaciones condicionales. Intenté usarlo para llamar al método, como este:

(condition) ? doThis() : doThat();

Ambos métodos vuelven vacíos. Java me dice que no es una declaración.

Entonces, supongo que no puedo hacer llamadas de método condicional ... ¿o puedo?


El operador ternario es simplemente azúcar sintáctico .
Hace que el código sea más fácil de leer / escribir, pero no agrega funcionalidad real.
Su uso principal fue comprimir varias líneas de código en una sola línea, y fue muy útil al crear cadenas que difieren solo un poco, según algunas condiciones.

p.ej.

Collection<?> col = ... System.out.println("There " + (col.size()==1 ? "is" : "are") + " " + col.size() + " " + (col.size()==1 ? "element" : "elements") + " in the collection");

en lugar de

Collection<?> col = ... String message = "There "; if(col.size()==1) message += "is"; else message += "are"; message += " "+col.size() if(col.size()==1) message += " element"; else message += " elements"; message += " in the collection"; System.out.println(message);

Como puedes ver, simplifica el código.
(Nota: en el segundo ejemplo, es mejor usar StringBuilder lugar de la concatenación de cadenas)

Pero desde (condition) ? doThis() : doThat(); (condition) ? doThis() : doThat(); (sin valores de retorno) tiene el mismo significado que if(condition) doThis(); else doThat(); if(condition) doThis(); else doThat(); Habría dos formas de escribir lo mismo, sin agregar funcionalidad. Solo complicaría las cosas:

  • para programadores: el código no es uniforme
  • para la implementación del operador ternario: ahora también tiene que soportar métodos de void

Entonces No , la operación ternaria no se puede usar para la llamada de método condicional. Utilice if-else en su lugar:

if(condition) doThis(); else doThat();


Piense en los operadores ternarios como un método en este caso. Diciendo a ? b : c a ? b : c es (para los propósitos y propósitos que está considerando, vea el comentario de lasseespeholt) equivalente a llamar al método de pseudocódigo:

ternary(a, b, c) if a return b else return c

¿Por eso la gente puede decir cosas como x = a ? b : c x = a ? b : c ; es básicamente como decir x = ternary(a, b, c) . Cuando dices (condition) ? doThis() : doThat() (condition) ? doThis() : doThat() , en efecto estás diciendo:

if condition return doThis() else return doThat()

Mira lo que pasa si intentamos sustituir los métodos por lo que devuelven.

if condition return ??? else return ???

Ni siquiera tiene sentido considerarlo. doThis() y doThat() no devuelven nada, porque void no es un tipo instantáneo, por lo que el método ternary tampoco puede devolver nada, así que Java no sabe qué hacer con su declaración y se queja.

Hay maneras de evitar esto, pero son todas malas prácticas (puede modificar sus métodos para obtener un valor de retorno, pero no hacer nada con lo que devuelven, puede crear nuevos métodos que llamen a sus métodos y luego devuelvan el valor nulo, etc. .). Usted está mucho mejor usando una sentencia if en este caso.

EDITAR Además, hay un problema aún más grande. Incluso si estuviera devolviendo valores, Java no considera a ? b : c a ? b : c una declaración en cualquier sentido.