variable the operator java ternary-operator ternary

the - Java Ternary sin asignación



ternary operator php (4)

¿Hay alguna manera de realizar una operación de ternario en Java sin realizar una tarea o una forma de simular la tarea?

OK, entonces cuando escribes una declaración como esta:

(bool1 && bool2) ? voidFunc1() : voidFunc2();

hay dos problemas distintos con el código:

  1. El segundo y tercer operandos de una expresión condicional 1 no pueden ser llamadas a métodos vacíos. Referencia: JLS 15.25 .

  2. Una expresión no es una declaración, a menos que sea una expresión de asignación O una llamada a un método O una creación de objeto. Referencia: JLS 14.8 .

De hecho, el segundo de estos problemas es un error de sintaxis y esperaría que cualquier compilador de Java convencional lo informe en lugar del primer problema. El primer problema solo se revelaría si hicieras algo como esto:

SomeType dummy = (bool1 && bool2) ? voidFunc1() : voidFunc2();

o

gobble((bool1 && bool2) ? voidFunc1() : voidFunc2());

donde gobble es un método que no hace nada ... excepto "consumir" el valor de su argumento.

AFAIK, no hay contexto en el que la expresión original sea aceptable.

1 - "Expresión condicional" es el término principal utilizado para esta construcción en la Especificación del lenguaje Java. Se llama el "operador condicional ternario" en Oracle Java Tutorial.

¿Hay alguna forma de realizar una operación de ternario en Java sin realizar una tarea o una forma de simular la tarea?

Me gusta cómo se ve el código ternario sucinto al hacer un montón de si / then / elses.

Espero poder llamar a una de las dos funciones vacías basadas en una declaración de álgebra booleana.

Algo como:

(bool1 && bool2) ? voidFunc1() : voidFunc2();

Mis funciones son de tipo de retorno void , así que si hay una manera de simular esto en una tarea para que funcione, entonces estoy de acuerdo con eso ... Me gustaría ver cómo hacerlo :)


No, no puedes hacer eso. La especificación así lo dice .

El operador condicional tiene tres expresiones de operando. ? aparece entre la primera y la segunda expresión, y: aparece entre la segunda y la tercera expresión.

La primera expresión debe ser de tipo boolean o Boolean, o se produce un error en tiempo de compilación.

Es un error de tiempo de compilación para la segunda o la tercera expresión de operando ser una invocación de un método de vacío .

[EDITAR]

Ya que preguntaste sobre la reflexión, aquí hay una solución. No estoy recomendando esto. Lo estoy publicando solo porque me lo preguntaste.

public class MyCall { public void a(){System.out.println("a");} public void b(){System.out.println("b");} public static void main(String... args) { new MyCall().go(); } public void go() { Class<? extends MyCall> class1 = this.getClass(); Method aMethod = class1.getMethod("b", null); Method bMethod = class1.getMethod("a", null); Object fake = false ? aMethod.invoke(this, null) : bMethod.invoke(this, null); Object fake2 = true ? aMethod.invoke(this, null) : bMethod.invoke(this, null); } }

Al final del día, debe preguntarse si la mejora mejora la legibilidad de su código (piense en cada bucle). Ninguna de estas soluciones mejora la legibilidad del código en mi humilde opinión. Si fuera tú, preferiría ir con esto.

if(condition) a(); else b();

De hecho, estoy por incluir llaves, incluso cuando los bucles solo contienen una sola línea, pero dado que buscas un código nítido, el fragmento de arriba debería funcionar.


No, no puedes hacer esto así.

Puede preferir este estilo si no le gusta hacer más declaraciones.

if(bool1 && bool2) voidFunc1(); else voidFunc2();

En el operador ternario, se requiere que los Operandos sean expresiones no nulas; es decir, deben producir algún valor real.


Si realmente quieres usar la operación ternany, entonces hay un truco. PERO este es un código muy malo, destinado solo para mostrar las habilidades del lenguaje. Nunca recomendaría poner este código en producción o incluso mostrarlo a tus amigos.

int dummy = (bool1 && bool2) ? new Object(){ public int hashCode() { yourFunction1(); // ... yourFunctionN(); return 0; }; }.hashCode() : new Object(){ public int hashCode() { yourAnotherFunction1(); // ... yourAnotherFunctionN(); return 0; }; }.hashCode();