2010-12-16 24 views
61

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

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

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

¿Qué hay de malo en esto? ¿Necesita paréntesis? ¿Dónde?

+1

Aunque mautetto ha proporcionado una mejor manera de escribir esto, esta estructura se suele llamar operador ternario. (En caso de que se lo pregunte;)) –

Respuesta

184

la "expresión ternario" x ? y : z sólo se puede utilizar para condicional asignación. Es decir, se podría hacer algo como:

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

porque la expresión ternaria está volviendo algo (de tipo String en este ejemplo).

No está destinado a ser usado como un corto, en línea if-else. En particular, no puede usarlo si las partes individuales no devuelven un valor, o devolver valores de tipos incompatibles. (Entonces, si puede hacer esto si ambos métodos devuelven el mismo valor, no debería llamarlo para efectos secundarios solamente).

Así que la forma correcta de hacer esto sería sólo con un bloque else if-:

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

que por supuesto puede ser acortado a

jXPanel6.setVisible(jXPanel6.isVisible()); 

Ambos de estas últimas expresiones son, por yo, más legible porque ellos comunican más claramente lo que estás tratando de hacer. (Y por cierto, ¿obtuviste tus condiciones al revés? Parece que de todos modos no es una operación, en lugar de una palanca).

No mezcle recuento bajo carácter con legibilidad. El punto clave es lo que se entiende más fácilmente; y usar un poco de las características del lenguaje es una manera definitiva de confundir a los lectores, o al menos hacer que hagan una doble toma mental.

27
jXPanel6.setVisible(jXPanel6.isVisible()); 

o en su forma:

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

¡Gracias por los consejos! – monczek

+14

FWIW, siento que * nunca * es necesario escribir '? true: false' porque es exactamente equivalente a '' bool condition> '. –

+1

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

2

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

Por lo que puedo decir, solo quieres cambiar el estado de visibilidad ¿no?¿Por qué no usar 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.

+0

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

+0

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