【问题标题】:Java Switch statement confusionJava Switch 语句混淆
【发布时间】:2014-11-02 19:50:37
【问题描述】:

在我的应用程序(这是一款 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 对象没有被识别?为什么是这样?如果我只是输入它,(case hero.HITBIRD),我会收到这个错误:

case 表达式必须是常量表达式

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

【问题讨论】:

  • 谢谢@BorisIvanov,我已经快速阅读了。我不确定我理解“使用初始化程序”是什么意思?这是否意味着 - 将其声明为(例如)int FELLOFFSCREEN,然后将其设置在某处 - 所以,FELLOFFSCREEN = 0?如果是这种情况,我猜我不能使用 final 关键字? - 谢谢
  • 你可以先试试 public final static int XXX = 1;或枚举?
  • 谢谢@BorisIvanov,我想我会选择枚举:-)

标签: java variables switch-statement final


【解决方案1】:

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

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
}

这更安全,更自描述。

【讨论】:

  • 嗨 JBNizet - 谢谢你,是的,我在代码的其他部分使用枚举,所以我认为这是要走的路......
  • Eeek,对不起,你能告诉我如何访问我的枚举吗?我已经设置好了,但我还是可以通过 switch 语句访问它?只要我输入“英雄”。什么都没有发生,所以我是否也必须在这里声明一些静态的东西,还是应该更改为 if-else?
  • switch (hero.killedBy()) { case FELL_OFF_SCREEN: { 当然,hero.killedBy() 必须返回一个HeroDeathCause 的实例。例如:return HeroDeathCause.HIT_BIRD;
【解决方案2】:

使您的int 常量静态

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

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


但是,对于these reasons,我会将这些设为枚举并打开它,或者在该枚举上设置当英雄因此而死亡时要采取的行动的方法,从而完全避免切换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-15
    • 2012-11-04
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    相关资源
    最近更新 更多