28

http://en.wikipedia.org/wiki/?のようなページでは、三項/条件付き演算子?:が条件付き割り当てに使用されているようです。次のように、メソッド呼び出しに使用しようとしました。

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

どちらのメソッドも void を返します。Javaは、それはステートメントではないと私に言います。

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

4

3 に答える 3

22

この場合、三項演算子をメソッドのように考えてください。言うa ? b : cことは(あなたが検討している意図と目的については、lasseespeholtのコメントを参照してください)擬似コードメソッドを呼び出すことと同等です:

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

だから人々は次のようなことを言うことができますx = a ? b : c; それは基本的に言うようなものx = ternary(a, b, c)です。あなたが言うとき(condition) ? doThis() : doThat()、あなたは事実上次のように言っています:

if condition
    return doThis()
else
    return doThat()

メソッドをそれらが返すものに置き換えようとするとどうなるか見てください

 if condition
    return ???
 else
    return ???

それを考えるのも意味がありません。 はインスタンス化可能な型ではないため、何doThis()も返さないでください。メソッドも何も返すことができないため、Javaはステートメントをどう処理するかわからず、文句を言います。 doThat()voidternary

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

編集 さらに、さらに大きな問題があります。値を返していたとしても、Javaはa ? b : cいかなる意味でもステートメントを考慮しません。

于 2012-09-23T17:44:08.713 に答える
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、文字列連結の代わりに使用することをお勧めします)

しかし、 (戻り値なしで)は、機能を追加せずに同じものを書く2つの方法がある(condition) ? doThis() : doThat();のと同じ意味を持っているので。if(condition) doThis(); else doThat();それは物事を複雑にするだけです:

  • プログラマー向け:コードが統一されていない
  • void三項演算子の実装の場合:メソッドもサポートする必要があります

したがって、いいえ、三項演算を条件付きメソッド呼び出しに使用することはできません。代わりにif-elseを使用してください。

if(condition)
    doThis();
else
    doThat(); 
于 2012-09-23T18:39:53.367 に答える
1

三項 (条件) 演算子は値を返します。メソッドがそうでない場合、それらは演算子の一部として使用できません (値を受け取る場所)。

よりよく理解するために、1 つの単純な二項演算子について考えてみましょう: +. 次のように動作します。

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

2 つの評価可能なパーツが必要で、別のパーツを返します。入力した場合

doThis() + doThat();

あるいは

gimmeAValue = doThis() + doThat();

どちらにdoThis()doThat()評価されず、失敗します(「返されます」void)。もちろん、演算子がそれらを処理して何らかの型の値を返すことができるようにするには、両方とも「互換性のある」型<eval1><eval2>なければなりません。+

次に、三項演算子を見てみましょう。

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

3 つの評価可能な部分を取り、値を返します。

最初の評価可能な部分は、ブール値としてコンパイラによって理解可能 (キャスト可能) でなければなりません。残りの 2 つの評価可能なパーツのどれを返却する必要があるかを決定するために使用されます。

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

つまり、三項条件演算子は、コードの分岐としてではなく、何かを返すことを目的としています。このように使用されます:

gimmeAValue = testMe() ? returnThis() : returnThat();
于 2012-09-23T22:07:23.453 に答える