Java 匿名数组索引而不是switch语句?
在Java中,我发现以下代码比相应的笨重的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:
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;
}