Индексирование анонимного массива вместо оператора switch? - PullRequest
2 голосов
/ 06 июня 2011

В Java следующий код гораздо чище и проще в обслуживании, чем соответствующий громоздкий оператор switch:

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 находится вне диапазона (хотя исключение обрабатывается)?

Если возможно, предложите что-нибудь почище?

Ответы [ 6 ]

5 голосов
/ 06 июня 2011

Ваш первый подход в порядке.

Однако лучше сначала проверить индекс:

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

if (i < 0 || i >= arr.length)
    i = 0;
selectedObj = arr[i];
2 голосов
/ 06 июня 2011

Это неприемлемая практика. Исключения - для обработки ошибок, а не для потока программ. Также исключения являются ОЧЕНЬ МЕДЛЕННЫМИ.

1 голос
/ 06 июня 2011

Лично, хотя я не сомневаюсь, что некоторые не согласятся, я бы сделал:

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.

1 голос
/ 06 июня 2011

Оба являются антипаттернами. Просто проверьте индекс на членство в диапазоне самостоятельно. Может быть способ использовать enum во многих реальных случаях.

1 голос
/ 06 июня 2011

Как насчет

if(index < arr.length && index >= 0){
    obj = arr[index];
}else{
    obj = defaultValue;
}
0 голосов
/ 06 июня 2011
    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);

Списки поступают из Гуавы.

...