Java Switch声明混乱

时间:2014-11-02 19:50:37

标签: 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语句中,我的英雄对象无法识别?为什么是这样?如果我只是输入它,(case hero.HITBIRD),我收到这个错误:

  

案例表达式必须是常量表达式

显然,为了便于阅读,我更倾向于使用我设置的变量名而不是原始数值......

2 个答案:

答案 0 :(得分:1)

使int常量静态

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

作为类常量,创建了 Hero实例之前可用且已知的值。


然而,对于these reasons,我会将这些作为枚举并且要么打开它,要么在英雄死亡时采取什么行动的枚举方法,因为它因此完全避免了切换。

答案 1 :(得分:1)

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

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

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

case Hero.HITBIRD {

(假设班级名称是英雄)。

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

public enum HeroDeathCause {
    FELL_OFF_SCREEN, HIT_BIRD, SQUASHED
}

这种类型更安全,更具自我描述性。