2

switchJavaでは、次のコードは、対応するかさばるステートメントよりもはるかにクリーンで保守が簡単です。

try {
  selectedObj = new Object[] {
    objA,
    objB,
    objC,
    objD,
  }[unvalidatedIndex];
} catch (ArrayIndexOutOfBoundsException e) {
  selectedObj = objA;
}

とは対照的に

switch (unvalidatedIndex) {
  case 0:
    selectedObj = objA;
    break;

  case 1:
    selectedObj = objB;
    break;

  case 2:
    selectedObj = objC;
    break;

  case 3:
    selectedObj = objD;
    break;

  default:
    selectedObj = objA;
}

前者は許容できる慣行と見なされますか?配列の割り当てと例外のキャッチが含まれるため、これが最も効率的な方法ではないことを認識しています。unvalidatedIndex範囲外の場合(例外は処理されますが)、望ましくない何かが発生しますか?

可能であれば、もっとクリーンなものを提案しますか?

4

6 に答える 6

5

最初のアプローチは問題ありません。

ただし、最初にインデックスを確認することをお勧めします。

Object[] arr = new Object[] { ... };

if (i < 0 || i >= arr.length)
    i = 0;
selectedObj = arr[i];
于 2011-06-06T14:03:16.780 に答える
2

それは容認できる慣行ではありません。例外はエラー処理用であり、プログラムフロー用ではありません。また、例外は非常に遅いです。

于 2011-06-06T14:31:08.810 に答える
1

個人的には、同意しない人がいることは間違いありませんが、私は次のようにします。

switch (unvalidatedIndex) {
    case 0 : selectedObj = objA; break;
    case 1 : selectedObj = objB; break;
    case 2 : selectedObj = objC; break;
    case 3 : selectedObj = objD; break;
    default: selectedObj = objA; break;
    }

クリーンで、コンパクトで、効率的で、非常に理解しやすいです。

case 0そのため、を含めることを躊躇しますdefault

于 2011-06-06T19:28:46.457 に答える
1

どうですか

if(index < arr.length && index >= 0){
    obj = arr[index];
}else{
    obj = defaultValue;
}
于 2011-06-06T14:04:38.837 に答える
1

どちらもアンチパターンです。範囲メンバーシップのインデックスを自分でテストするだけです。enum実際の多くの場合、 を使用する方法があるかもしれません。

于 2011-06-06T19:07:19.070 に答える
-1
    int index = 4;

    ArrayList<String> myObjects = Lists.newArrayList("a", "b", "c", "d");
    Object o = index  < myObjects.size() && index >= 0 ? myObjects.get(index) : null;
    System.out.println(o);

リストはグアバから来ています。

于 2011-06-06T14:10:14.610 に答える