【问题标题】:Is there a way to use a string to pick a variable?有没有办法使用字符串来选择变量?
【发布时间】:2014-08-09 14:08:36
【问题描述】:

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

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
}

这行得通。变量“moveSouth0moveSouth1”等是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 个 switch 子句。 显然这不起作用,因为我必须返回 BufferedImage 而我现在返回的是 String

问:所以我正在寻找一种将String 更改为变量名称的方法

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

【问题讨论】:

  • 你的 BufferedImage 的成员变量是类的还是本地的?
  • @MrPixelDream 他们是成员变量
  • 使用可枚举类型设置所有方向并在返回时对其调用 .name() 或 .toString() 方法怎么样? docs.oracle.com/javase/7/docs/api/java/lang/Enum.html
  • @Chronicle 我为你写了一个答案。使用成员变量,这是可能的。

标签: java string switch-statement


【解决方案1】:

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

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

二维数组会更好。

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

【讨论】:

  • 反射呢?这样做的风格不好,但有可能。
【解决方案2】:

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

你可以这样做:

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

但是,即使有可能,在我看来,您也应该继续使用当前的开关。

【讨论】:

  • 我猜“它不是很好的风格”是因为性能较慢?
  • 老实说,我不确定性能,但反射基本上是一个检查对象和东西的工具,而不是一个执行语言默认不提供的东西的工具。
猜你喜欢
  • 2019-12-21
  • 2023-04-02
  • 1970-01-01
  • 2021-09-06
  • 2020-11-08
  • 2019-09-06
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多