假设我们有以下代码在动画中的精灵之间切换。有八个方向(北,东北,东,等)。我们在它们之间切换,现在我们根据动画周期选择一个精灵。这是代码:
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中)?
答案 0 :(得分:4)
我会改写一下。虽然它可以通过反射来完成,但它会很丑陋,不安全(因为,正如您在其他答案中看到的那样,您必须将变量名称作为String提供,如果您输入一个不存在的变量的名称,编译器不会捕获您的错误,并且您将在运行时获得异常并且效率较低。
因此,您应该做的是将所有这些变量存储在一个数组中,并使用数组的索引来确定返回哪些变量。
二维数组会更好。
BufferedImage[][] move = ...;
...
return move[directionIndex][spriteIndex];
答案 1 :(得分:3)
是可能,但我不建议这样做,因为基本上它不是一个好的风格。
以下是如何做到的:
Field field = YourClass.class.getField("nameOfTheVarGoesHere");
BufferedImage sprite = (BufferedImage) field.get(this);
然而,尽管有可能,但我认为你应该继续使用当前的开关。