web-dev-qa-db-fra.com

Short IF - ELSE statement

J'essaie de rendre mon code plus lisible, alors j'ai décidé d'utiliser quelques instructions IF courtes.

Voici mon code qui ne fonctionne pas ("pas une déclaration"):

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

Quel est le problème avec cela? Besoin de crochets? Où?

79
monczek

La "expression ternaire" x ? y : z ne peut être utilisée que pour une condition affectation. C'est-à-dire que vous pourriez faire quelque chose comme:

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

parce que l'expression ternaire renvoie quelque chose (de type String dans cet exemple).

Ce n'est pas vraiment destiné à être utilisé comme un court [en ligne] if-else. En particulier, vous ne pouvez pas l'utiliser si les pièces individuelles ne renvoient pas de valeur ou renvoient des valeurs de types incompatibles. (Ainsi, bien que vous puissiez le faire si les deux méthodes renvoient la même valeur, vous ne devriez pas l'invoquez uniquement aux fins des effets secondaires).

Donc, la bonne façon de faire cela serait simplement avec un bloc if-else:

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

qui bien sûr peut être raccourci à

jXPanel6.setVisible(jXPanel6.isVisible());

Pour moi, ces deux dernières expressions sont plus lisibles en ce sens qu'elles communiquent plus clairement ce que vous essayez de faire. (Et au fait, avez-vous mal interprété vos conditions? On dirait que c'est un non-op de toute façon, plutôt qu'une bascule).

Ne confondez pas nombre de caractères faible avec lisibilité. Le point clé est ce qui est le plus facilement compris. et l'utilisation légèrement abusive des fonctionnalités du langage est un moyen sûr de confondre les lecteurs, ou du moins de leur faire faire une double-prise mentale.

206
Andrzej Doyle
jXPanel6.setVisible(jXPanel6.isVisible());

ou sous votre forme:

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

Comme d’autres l’ont indiqué, quelque chose de la forme

x ? y : z

est une expression, pas une déclaration (complète). C'est une valeur qui doit être utilisée quelque part, comme à droite d'une affectation, ou un paramètre d'une fonction, etc.

Peut-être pourriez-vous regarder ceci: http://download.Oracle.com/javase/tutorial/Java/nutsandbolts/expressions.html

3
Anshuman Fotedar

L'opérateur ternaire ne peut être que le côté droit d'une affectation et non une déclaration en soi.

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

3
perdian

Je suis un peu en retard à la fête mais pour les futurs lecteurs.

D'après ce que je peux dire, vous voulez simplement basculer l'état de visibilité correctement? Pourquoi ne pas simplement utiliser l'opérateur !?

jxPanel6.setVisible(!jxPanel6.isVisible);

Ce n'est pas une instruction if mais je préfère cette méthode pour le code correspondant à votre exemple.

2
Andy Body