これは多かれ少なかれ「毎日の」パターンであるいくつかのコードです:
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# の皆さん。