2

これは多かれ少なかれ「毎日の」パターンであるいくつかのコードです:

public static Value getValue() {    
    if ( cond1 ) {
        return val1;
    }
    if ( cond2 ) {
        return val2;
    }
    if ( cond3 ) {
        return val3;
    }
    throw new AnyException();
}

一見すると、次のreturnような短絡計算を維持する単一のステートメントに折りたたむことができるように見えます。

public static Value getValue() {    
    return cond1 ? val1 :
           cond2 ? val2 :
           cond3 ? val3 :
           throw new AnyException() // it could be a legal piece of code in Java
                                    // if the `throw` statement could be an expression
           ;
}

ただし、throw式ではなくステートメントのキーワードであるため、これは正しくありません。一般的な方法を使用して、次の回避策を試しました。

// Exceptions.java
// Just pretend to let the compiler think it's not an exception statement
public static <T, E extends Throwable> T exception(E ex) throws E {
    throw ex;
}

...
// Return.java
public static Value getValue() {    
    return cond1 ? val1 :
           cond2 ? val2 :
           cond3 ? val3 :
           Exceptions.<Value, AnyException>exception(new AnyException());
}

ステートメントの最後の行は、次のreturn理由で醜く見えます。

  • 詳細な構文と必要な型のパラメーター化。
  • ここでは、静的インポート ディレクティブは使用できません。

そのコードをもう少し良くするエレガントな方法はありますか? 前もって感謝します。

(私はまだJava 6を使用する必要があります)

編集:

それから 3 年後、この機能は驚くべきことにC# 7.0に実装されました。とても便利で自然で、複雑ではないと思います。例:

public string GetFirstName()
{
    var parts = Name.Split(" ");
    return parts.Length > 0
        ? parts[0]
        : throw new InvalidOperationException("No name!");
}

ラッキーな C# の皆さん。

4

4 に答える 4

5

条件演算子の外で使用した場合exception、型推論は正しいことを行います。Valueここでは、型引数を指定する代わりに、結果をにダウンキャストできますexception()

return cond1 ? val1 :
       cond2 ? val2 :
       cond3 ? val3 :
       (Value)exception(new AnyException());

またはグローバルに、条件式全体に対して:

return (Value) (
       cond1 ? val1 :
       cond2 ? val2 :
       cond3 ? val3 :
       exception(new AnyException()));

これはエレガンスの点ではまだゴールドではありませんが、長い道のりだと思います. この場合、 の静的インポートを使用できることに注意してくださいexception()

于 2013-09-16T13:13:58.357 に答える
2

行を再配置して別のステートメントを追加するとif、読みやすいものを維持しながら行の量を最小限に抑えることができます。

if(!(cond1 || cond2 || cond3)) throw new AnyException();
return cond1 ? val1 :
       cond2 ? val2 :
       cond3 ? val3;

ただし、あなたは物事を過度に複雑にしていると言わざるを得ません。読みやすいコードは、ほとんどの場合、本当に簡潔なコードよりも優れています。最初の例では、あなたが何をしようとしているのかすぐにわかります。2 番目の例では、私は実際に集中する必要があります。

于 2013-09-16T12:30:11.453 に答える
0
int length = 1;
String s = "abc"

return (length == s.length())? length: length+1;

リターン関数の if else の短縮形。

于 2020-05-08T11:59:40.520 に答える