短いIF-ELSEステートメント


82

コードを読みやすくしようとしているので、短いIFステートメントを使用することにしました。

これが機能しない(「ステートメントではない」)私のコードです:

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

これの何が問題になっていますか?ブラケットが必要ですか?どこ?


2
mautettoはこれを書くためのより良い方法を提供しましたが、この構造は通常三項演算子と呼ばれます。(あなたが疑問に思っていた場合;))
リースムーア

これは条件演算子です。「三項」は、3つのオペランドがあることを意味します。

条件演算子のための言語仕様へのリンク:docs.oracle.com/javase/specs/jls/se10/html/...

回答:


215

「三元式」x ? y : zは、条件付き代入にのみ使用できます。つまり、次のようなことができます。

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

三項式が何か(Stringこの例ではタイプの)を返しているからです。

短いインラインとして使用することを意図したものではありませんif-else。特に、個々のパーツが値を返さない場合、または互換性のないタイプの値を返す場合は、使用できません。(したがって、両方のメソッドがたまたま同じ値を返した場合にこれを行うことはできますが、副作用の目的でのみ呼び出すべきではありません)。

したがって、これを行う適切な方法は、if-elseブロックを使用することです。

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

もちろんこれはに短縮することができます

jXPanel6.setVisible(jXPanel6.isVisible());

後者の表現はどちらも、私にとっては、あなたがやろうとしていることをより明確に伝えるという点で、より読みやすくなっています。(ちなみに、あなたはあなたの条件を間違った方法で取得しましたか?これはトグルではなく、とにかく何もしないようです)。

少ない文字数読みやすさを混同しないでください。重要な点は、最も簡単に理解できることです。そして、言語機能を少し誤用することは、読者を混乱させる、または少なくとも彼らに精神的な二重の見方をさせる確実な方法です。


1
割り当てに条件演算子しか使用できないというのは、単純に真実ではありません。式が必要な場所ならどこでも使用できます。

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

またはあなたのフォームで:

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

14
FWIW、ちょうどとまったく同じなので、書く必要はないと思います。<bool condition> ? true : false<bool condition>
Andrzej Doyle

2
明らかに!しかし、monczekはShort If-Elseステートメントについて質問したので、構文を示すためだけにコーディングしました。
mauretto 2013

4

三項演算子は、代入の右側にのみ存在でき、それ自体のステートメントにはなりません。

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


条件演算子が割り当てのRHSでのみ使用できるというのは真実ではありません。式を使用できる場所であればどこでも使用できます。


2

私はパーティーに少し遅れていますが、将来の読者のために。

私が言えることから、あなたはただ可視性の状態を正しく切り替えたいだけですか?!演算子を使用しないのはなぜですか?

jxPanel6.setVisible(!jxPanel6.isVisible);

これはifステートメントではありませんが、例に関連するコードにはこのメソッドをお勧めします。


また、状態を切り替えようとしている場合は、ステートメントが逆になっていると思います。これが機能しなかった理由ですか?jXPanel6.isVisible()である必要がありますか?jXPanel6.setVisible(false):jXPanel6.setVisible(true);
アンディボディ2015年

トグルステートメントでない場合は、すでにそのように設定されているものを表示する目的がわかりません。isVisibleが状態を取得し、setVisibleが状態を設定します。isVisibleステートメントがtrueを返す場合は、なぜそれを再びtrueに設定するのですか。私は何かが足りないのですか?
アンディボディ2015年

1

あなたはこれと同じくらい簡単にそれをすることができます、私は反応フックでそれをしました:

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

以下の関数の場合、これと同じ長さでした。

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

お役に立てば幸いです^ _ ^

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.