82

私はそれが良いプログラミングの実践であると信じているので、(ローカルまたはインスタンスの) 変数finalが 1 回だけ書き込まれることを意図している場合は、すべてを作成します。

ただし、変数の割り当てで例外がスローされる可能性がある場合、その変数を final にすることはできないことに気付きました。

final int x;
try {
    x = Integer.parseInt("someinput");
}
catch(NumberFormatException e) {
    x = 42;  // Compiler error: The final local variable x may already have been assigned
}

一時変数に頼らずにこれを行う方法はありますか? (または、これは final 修飾子の適切な場所ではありませんか?)

4

2 に答える 2

74

これを行う1つの方法は、(非final)一時変数を導入することですが、あなたはそれをしたくないと言いました。

もう1つの方法は、コードの両方のブランチを関数に移動することです。

final int x = getValue();

private int getValue() {
  try {
    return Integer.parseInt("someinput");
  }
  catch(NumberFormatException e) {
    return 42;
  }
}

これが実用的かどうかは、正確なユースケースによって異なります。

全体として、適切にスコープされたローカル変数である限りx、最も実用的な一般的なアプローチは、それを非に保つことかもしれませんfinal

一方、xがメンバー変数である場合、final初期化中に非一時的なものを使用することをお勧めします。

public class C {
  private final int x;
  public C() {
    int x_val;
    try {
      x_val = Integer.parseInt("someinput");
    }
    catch(NumberFormatException e) {
      x_val = 42;
    }
    this.x = x_val;
  }
}
于 2012-11-28T11:38:30.637 に答える
-1

いいえ、それは適切な場所ではありません。try と catch ブロックに 1 つ以上のステートメントがあると想像してください。最初のステートメントは x = 42 と言っています。 x = 30 と言います。x を 2 回定義しました。

于 2012-11-28T11:39:21.100 に答える