有没有办法使用字符串来选择变量?

时间:2014-08-09 14:08:36

标签: java string switch-statement

假设我们有以下代码在动画中的精灵之间切换。有八个方向(北,东北,东,等)。我们在它们之间切换,现在我们根据动画周期选择一个精灵。这是代码:

switch (direction){
    case 0: // south
        switch(sprite){
            case 0: return moveSouth0;
            case 1: return moveSouth1;
            case 2: return moveSouth2;
            case 3: return moveSouth3;
        }
    case 1: // south-east
        switch(sprite){
            case 0: return moveSouthEast0;
            case 1: return moveSouthEast1;
            case 2: return moveSouthEast2;
            case 3: return moveSouthEast3;
        }
    case 2: // east
        switch(sprite){
            case 0: return moveEast0;
            case 1: return moveEast1;
            case 2: return moveEast2;
            case 3: return moveEast3;
        }
    case 3: // northeast
    // etcetera
}

这很有效。变量“ moveSouth0 moveSouth1 ”等等是BufferedImage个变量。

然而,它很长并且使用相同的代码。我的理想情况是执行以下操作:

String s;
switch (direction){
    case 0: // south
        s = "South";
        break;
    case 1: // south-east
        s = "SouthEast";
        break;
    // etcetera
}
return "move" + s + sprite; // <- now returns string, should return BufferedImage

正如您所看到的,这里我不需要在每个方向的情况下再制作8个切换子句。 显然这不起作用,因为我必须返回BufferedImage而我现在正在返回String

问:我正在寻找的是将String更改为变量名称的方法。

这样的事情是否可能(在Java中)?

2 个答案:

答案 0 :(得分:4)

我会改写一下。虽然它可以通过反射来完成,但它会很丑陋,不安全(因为,正如您在其他答案中看到的那样,您必须将变量名称作为String提供,如果您输入一个不存在的变量的名称,编译器不会捕获您的错误,并且您将在运行时获得异常并且效率较低。

因此,您应该做的是将所有这些变量存储在一个数组中,并使用数组的索引来确定返回哪些变量。

二维数组会更好。

BufferedImage[][] move = ...;
...
return move[directionIndex][spriteIndex];

答案 1 :(得分:3)

可能,但我不建议这样做,因为基本上它不是一个好的风格。

以下是如何做到的:

Field field = YourClass.class.getField("nameOfTheVarGoesHere");  
BufferedImage sprite = (BufferedImage) field.get(this);

然而,尽管有可能,但我认为你应该继续使用当前的开关。