在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
超出范围时(虽然处理了异常)会不会引起不良后果?
如果可能的话,你会建议更干净的东西吗?
答案 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);
列表来自番石榴。