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

Java 匿名数组索引而不是switch语句?,java,switch-statement,indexoutofboundsexception,anonymous-arrays,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:

在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
超出范围时(尽管已处理异常),是否会导致出现不希望出现的情况


如果可能的话,你能推荐一些更干净的吗?

你的第一种方法很好

但是,最好先检查索引:

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

if (i < 0 || i >= arr.length)
    i = 0;
selectedObj = arr[i];
Object[]arr=新对象[]{…};
如果(i<0 | | i>=arr.length)
i=0;
选择dOBJ=arr[i];
怎么样

if(index < arr.length && index >= 0){
    obj = arr[index];
}else{
    obj = defaultValue;
}
if(索引=0){
obj=arr[指数];
}否则{
obj=默认值;
}
int index=4;
ArrayList myObjects=Lists.newArrayList(“a”、“b”、“c”、“d”);
对象o=index=0?get(index):null;
系统输出打印ln(o);

列表来自番石榴。这是不可接受的做法。异常用于错误处理,而不是程序流。
异常也非常慢。

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

就我个人而言,尽管我相信有些人会不同意,但我会:

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;
    }
它干净、紧凑、高效,而且非常容易理解


我会犹豫是否包括
案例0
,它是
默认的
案例。

很好,但是它用一个只使用一次的额外标识符
arr
污染了名称空间。另一方面,如果使用匿名数组,
arr.length
可以替换为常量
4
,但这会导致始终保持此常量与数组同步的维护成本。我知道我听起来很挑剔,但我问这个是出于好奇。@Blagovest:将它包装在
{}
中,以生成一个内部作用域并隐藏变量。或者创建一个
静态
函数,该函数获取一个索引和一个
对象…
并返回一个对象。你真的不需要
数组列表
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;
    }