Declaración corta IF - ELSE


82

Estoy tratando de hacer que mi código sea más legible, así que decidí usar algunas declaraciones IF cortas.

Aquí está mi código que no funciona ("no es una declaración"):

jXPanel6.isVisible() ? jXPanel6.setVisible(true) : jXPanel6.setVisible(false);

¿Qué pasa con esto? ¿Necesita corchetes? ¿Dónde?


2
Aunque mautetto ha proporcionado una mejor manera de escribir esto, esta estructura generalmente se llama operador ternario. (En caso de que se lo esté preguntando;))
Reese Moore

Es el operador condicional . "Ternario" solo significa que tiene 3 operandos.

Enlace a la especificación de idioma para el operador condicional: docs.oracle.com/javase/specs/jls/se10/html/…

Respuestas:


214

La "expresión ternaria" x ? y : zsolo se puede utilizar para asignación condicional . Es decir, podrías hacer algo como:

String mood = inProfit() ? "happy" : "sad";

porque la expresión ternaria está devolviendo algo (de tipo Stringen este ejemplo).

Realmente no está destinado a ser utilizado como un corto, en línea if-else. En particular, no puede usarlo si las partes individuales no devuelven un valor o devuelven valores de tipos incompatibles. (Por lo tanto, si bien podría hacer esto si ambos métodos devuelven el mismo valor, no debe invocarlo solo para efectos secundarios).

Entonces, la forma correcta de hacer esto sería con un bloque if-else:

if (jXPanel6.isVisible()) {
    jXPanel6.setVisible(true);
}
else {
    jXPanel6.setVisible(false);
}

que por supuesto se puede acortar a

jXPanel6.setVisible(jXPanel6.isVisible());

Ambas últimas expresiones son, para mí, más legibles porque comunican más claramente lo que estás tratando de hacer. (Y, por cierto, ¿obtuviste tus condiciones al revés? De todos modos, parece que esto no es una operación, en lugar de una alternancia).

No mezcle el número bajo de caracteres con la legibilidad . El punto clave es lo que se comprende más fácilmente; y el uso indebido leve de las características del lenguaje es una forma definitiva de confundir a los lectores, o al menos hacer que se equivoquen mentalmente.


1
Simplemente no es cierto que solo pueda usar el operador condicional para la asignación. Puede usarlo en cualquier lugar donde se requiera una expresión.

28
jXPanel6.setVisible(jXPanel6.isVisible());

o en tu forma:

jXPanel6.setVisible(jXPanel6.isVisible()?true:false);

14
FWIW, creo que nunca es necesario escribir <bool condition> ? true : falseporque es exactamente equivalente a just <bool condition>.
Andrzej Doyle

2
¡Obviamente! Pero monczek preguntó acerca de la declaración Short If-Else, así que la codifiqué solo para mostrar la sintaxis.
mauretto

4

El operador ternario solo puede ser el lado derecho de una asignación y no una declaración propia.

http://www.devdaily.com/java/edu/pj/pj010018/


No es cierto que el operador condicional solo se pueda utilizar en el RHS de una asignación. Puede usarse en cualquier lugar donde se pueda usar una expresión.


2

Llego un poco tarde a la fiesta pero para futuros lectores.

Por lo que puedo decir, solo quieres cambiar el estado de visibilidad, ¿verdad? ¿Por qué no utilizar simplemente el !operador?

jxPanel6.setVisible(!jxPanel6.isVisible);

No es una declaración if, pero prefiero este método para el código relacionado con su ejemplo.


Además, si está tratando de cambiar el estado, creo que la declaración está al revés. ¿Es por eso que no funcionó? ¿Debería ser jXPanel6.isVisible ()? jXPanel6.setVisible (falso): jXPanel6.setVisible (verdadero);
Andy Body

Si no es una declaración de alternancia, entonces no entiendo el propósito de hacer visible algo que ya está configurado de esa manera. IsVisible recupera el estado y setVisible establece el estado, ¿verdad? Si la declaración isVisible devuelve verdadero, ¿por qué establecerlo en verdadero nuevamente? ¿Me estoy perdiendo de algo?
Andy Body

1

Puedes hacerlo tan simple como esto, lo hice en react hooks:

 (myNumber == 12) ? "true" : "false"

era igual a esta función larga if a continuación:

if (myNumber == 12) {
  "true"
} else {
  "false"
}

Espero que ayude ^ _ ^

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.