Java Switch语句困惑

标签 java variables switch-statement final

在我的应用程序(这是一个 Android 游戏)中,我有一个方法可以检查玩家是否还活着,如果没有,则运行动画并且游戏结束。

目前有 3 种不同的动画可用,具体取决于玩家失败的方式。

例如,它们可能会从屏幕上掉下来,撞到鸟,或者被从天上掉下来的东西压扁。每个都有不同的动画。

基本上,我正在做的是:

当玩家失败时,我设置了失败发生的方法,例如,如果他们被鸟击中:

hero.setKilledBy(hero.HITBIRD);

然后我通过在 checkGameOver() 方法中进行切换来执行此操作。然而,我很困惑。我必须像这样检查它:(注意,在我的情况下,我必须输入 0, 1, 2):

switch(hero.killedBy()){

    case 0: {                            
        fallOffScreenAnimation();break;
    }

    case 1: {
        hitBirdAnimation();break;
    }
    case 2: {
        squashedAnimation();
    }
}

在我的英雄对象的类中,我有以下方法

int killedBy;
final int FELLOFFSCREEN = 0;
final int HITBIRD = 1;
final int SQUASHED = 2;

int killedBy(){

    return killedBy;

}

int setKilledBy(int value){

    killedBy = value;

}

所以,我的问题是,为什么我不能做这样的事情:

switch(hero.killedBy()){

    case hero.HITBIRD {
        fallOffScreenAnimation();break;
    }

 //............... and so on.......

在 switch 语句中,我的英雄对象未被识别?为什么是这样?如果我只是输入它,(案例 Hero.HITBIRD),我会收到此错误:

case expressions must be constant expressions

显然,为了可读性,我更愿意使用我设置的变量名称而不是原始数值......

最佳答案

您只能在情况下使用常量。您的变量是实例变量,而不是常量。每个英雄都有这些变量的副本。它们应该声明为:

static final int FELLOFFSCREEN = 0;
static final int HITBIRD = 1;
static final int SQUASHED = 2;

您应该使用类名而不是对象来访问它们:

case Hero.HITBIRD {

(假设类名为 Hero)。

请注意,您可能应该用枚举替换这些常量:

public enum HeroDeathCause {
    FELL_OFF_SCREEN, HIT_BIRD, SQUASHED
}

这更加类型安全,并且更具 self 描述性。

关于Java Switch语句困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26703620/

相关文章:

python - 有没有办法在Python中跨线程添加变量

javascript - 为什么这个 switch 语句不起作用?

android - 如何检查 SwitchPreference 的当前状态?

java - switch 语句中变量作用域的原理

java - Bufferedimage 上的可拖动形状

Java Map 读取文件存储在 Map 中的第一个字母作为单词的键和值

java - Spring Security 与 Project Reactor 集成

java - 文件目标选择器

javascript - 将 JavaScript 变量作为值注入(inject)匿名函数中

javascript - 使用ajax调用php并返回多个变量?