匿名数组索引而不是switch语句?

时间:2011-06-06 14:01:28

标签: java switch-statement indexoutofboundsexception anonymous-arrays

在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 个答案:

答案 0 :(得分:5)

你的第一种方法很好。

但是,最好首先检查索引:

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

if (i < 0 || i >= arr.length)
    i = 0;
selectedObj = arr[i];

答案 1 :(得分:2)

这不是一种可接受的做法。例外是错误处理,而不是程序流。 也有例外非常慢。

答案 2 :(得分:1)

怎么样

if(index < arr.length && index >= 0){
    obj = arr[index];
}else{
    obj = defaultValue;
}

答案 3 :(得分:1)

两者都是反模式。只需自己测试范围成员资格的索引。在许多实际情况中,可能有一种方法可以使用enum

答案 4 :(得分: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案例。

答案 5 :(得分:-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);

列表来自番石榴。