2

在Java中,我发现下面的代码更清洁和更容易保持比相应的笨重switch声明:匿名数组索引而不是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超出范围(虽然处理异常)时会引起不希望的情况吗?

如果可能,你会建议一些更清洁的东西吗?

回答

5

你的第一种方法很好。

然而,最好先检查索引:

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

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

不错,但是这会污染名字空间,只用一次额外的标识符'arr'。另一方面,如果使用匿名数组,'arr.length'可以用常量'4'替代,但是会导致维护成本始终保持不变并且数组同步。我知道我听起来很挑剔,但我出于好奇而问这个。 – 2011-06-06 14:18:06

+1

@Blagovest:用'{}'包装它来创建一个内部作用域并隐藏这个变量。或者创建一个'static'函数,它接受一个索引和一个'Object ...'并返回一个对象。 – SLaks 2011-06-06 14:23:29

1

if(index < arr.length && index >= 0){ 
    obj = arr[index]; 
}else{ 
    obj = defaultValue; 
} 
-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); 

列表如何来源于番石榴。

+1

你真的不需要'ArrayList'。 – SLaks 2011-06-06 14:22:47

2

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

1

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

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的情况。