2012-09-23 9 views
25

http://en.wikipedia.org/wiki/?:のようなページでは、三項/条件演算​​子?:が条件付き代入として使用されているようです。私はこのようにメソッド呼び出しのために使用しようとしました:値を代入するのではなく、Javaの三項/条件演算​​子(?:)を使用してメソッドを呼び出すことはできますか?

(condition) ? doThis() : doThat(); 

どちらのメソッドもvoidを返します。 Javaはそれが声明ではないと私に伝えます。

私は条件付きメソッド呼び出しを行うことができないと推測しています...または私はできますか?

+14

いいえ、そうではありません。普通の人のように 'if'を使うだけです。 –

+1

私は、三項演算子は、条件のチェックで型のインスタンスに値を代入すると考えています。あなたがそれを示唆している方法はフォーマットを満足させるものではありません。 –

+0

@codeparkle - たくさんのスペースはありません。 if(条件){doThis();} else {doThat();} – tehdoommarine

答えて

18

この場合、三項演算子をメソッドのように考えてください。 ;人々はx = a ? b : cのようなものを言うことができる理由

ternary(a, b, c) 
    if a 
     return b 
    else 
     return c 

である:a ? b : cは、擬似コードのメソッドを呼び出すのと同じ(あなたが検討しているの意図や目的のために、lasseespeholtのコメントを参照)であると言って基本的にはx = ternary(a, b, c)と言っているようです。あなたが(condition) ? doThis() : doThat()を言うとき、あなたは実際にしていると言って:

if condition 
    return doThis() 
else 
    return doThat() 

は、我々は、彼らが

if condition 
    return ??? 
else 
    return ??? 

を返す何のための方法を代用しようとした場合それも、それを考慮しても意味がありません。何が起こるか見て。 Javaはあなたの文で何をすべきかを知っていると文句を言うしないので、voidがインスタンス化タイプではないので、doThis()doThat()は、何も返さないので、ternary方法は、どちらか何かを返すことはできません。

あり、この回避する方法がありますが、彼らはすべての(あなたがして、戻り値を持っているあなたの方法を変更することができますが、彼らは返すものと何もしない、あなたのメソッドを呼び出す新しいメソッドを作成することができますし、悪い習慣ですnullを返すなど)。この場合、ifステートメントを使用するほうがはるかに優れています。

EDITはさらに、さらに大きな問題があります。たとえあなたが値を返していたとしても、Javaはどんな意味でもa ? b : cとはみなされません。

+1

"a?b:cと言っても、擬似コードメソッド" < - Nope。 'b'や' c'が副作用がある状況を考えてみましょう。だから、後の例のようにそれらをラムダとみなす必要があります。 –

+0

真。私は単純化していることを明確にします。 – Jodaka

+3

@ Jodaka、私は正しい答えとしてあなたの編集を考慮します。なぜなら、値を返すことではないからです。 b:文としてのc。 – Kareem

2

三項演算子は、単にシンタックスシュガーです。
コードを読み書きするのが簡単になりますが、実際の機能は追加されません。
主な用途は、複数行のコードを1行に圧縮することでした。いくつかの条件に基づいてわずかに異なる文字列を構築する場合に非常に便利でした。

例えば、

Collection<?> col = ... 
System.out.println("There " + (col.size()==1 ? "is" : "are") + " " 
    + col.size() + " " + (col.size()==1 ? "element" : "elements") 
    + " in the collection"); 

代わりの

Collection<?> col = ... 
String message = "There "; 
if(col.size()==1) 
    message += "is"; 
else 
    message += "are"; 
message += " "+col.size() 
if(col.size()==1) 
    message += " element"; 
else 
    message += " elements"; 
message += " in the collection"; 
System.out.println(message); 

あなたが見ることができるように、それはコードを簡素化します。
(注意:2番目の例では、代わりに、文字列の連結のStringBuilderを使用することをお勧めします)(戻り値なし)

しかし(condition) ? doThis() : doThat();以降はせずに、同じことを書くの二つの方法があるだろうif(condition) doThis(); else doThat();と同じ意味を持っています機能を追加します。プログラマのための

  • :それだけの事を複雑にするコードは、三項演算子の実装のための均一な
  • ではありません:それは今までも サポートしていvoid方法

のでいいえ、三項演算を条件付きメソッド呼び出しに使用することはできません。

if(condition) 
    doThis(); 
else 
    doThat(); 
1

3値(条件付き)演算子は値を返します。メソッドがそうでなければ、演算子の一部として使用することはできません(値をとる場所)。

これをよりよく理解するために、単純なバイナリ演算子の1つである+を考えてみましょう。これは次のように動作します。

<eval1> + <eval2> --> <value> 

評価可能な2つの部品が必要です。 あなたが

doThis() + doThat(); 

あるいは

gimmeAValue = doThis() + doThat(); 

それが失敗すると、入力した場合doThis()doThat()どちらも何にも評価として、(彼ら "リターン" void)。 もちろん、<eval1><eval2>の両方とも、ある程度互換性のある型でなければなりません。+オペレータがそれらを処理して何らかの型の値を返すことができます。それは、3つの評価の部分をとり、その値を返します

<evalBoolean> ? <eval1> : <eval2> --> <value> 

今度は、三項演算子を見てみましょう。

最初の評価可能な部分は、コンパイラがブール値として理解できる(キャスト可能)必要があります。これは、評価可能な他の2つの部品のうちどれを返品するかを決定するために使用されます。

他の2つの評価可能な部分は、よく評価できるものでなければなりません。何かに。ある種の。

つまり、三項条件演算子は、コード分岐としてではなく、何かを返すことを意図しています。この方法で使用します:

関連する問題