Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java开关语句混淆_Java_Variables_Switch Statement_Final - Fatal编程技术网

Java开关语句混淆

Java开关语句混淆,java,variables,switch-statement,final,Java,Variables,Switch Statement,Final,在我的应用程序(这是一款Android游戏)中,我有一种方法可以检查玩家是否还活着,如果没有,运行一个动画,游戏就结束了 根据玩家的输球方式,目前有3种不同的动画可用 例如,它们可能从屏幕上掉下来,撞到一只鸟,或者被从天上掉下来的东西压扁。每一个都有不同的动画 基本上,我所做的是: 当玩家输了,我设置了发生的方法,例如,如果他们被鸟击中: hero.setKilledBy(hero.HITBIRD); 然后我通过在checkGameOver()方法中切换来实现这一点。然而,我很困惑。我必须这样

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

根据玩家的输球方式,目前有3种不同的动画可用

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

基本上,我所做的是:

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

hero.setKilledBy(hero.HITBIRD);
然后我通过在checkGameOver()方法中切换来实现这一点。然而,我很困惑。我必须这样检查:(注意,在我的情况下,我必须输入0,1,2):

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

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),我会得到以下错误:

大小写表达式必须是常量表达式


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

使您的
int
常量为静态:

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



但是,因为我会将这些设置为一个枚举,然后打开它,或者在枚举上有一些方法,说明当英雄因此死亡时要采取什么行动,从而完全避免切换。

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

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
}

这是更安全的类型,更自我描述。

检查这一个谢谢@BorisIvanov,我已经快速阅读了。我不确定我是否理解“使用初始化器”的含义?这是否意味着-将其声明为(例如)int FELLOFFSCREEN,然后将其设置在某个位置-因此,FELLOFFSCREEN=0?如果是这样的话,我猜我不能使用最后一个关键字感谢您尝试第一次公开最终静态int XXX=1;或者ENUM?谢谢@BorisIvanov,我想我会使用ENUM:-)Hi JBNizet-谢谢,是的,我在代码的其他部分使用ENUM,所以我认为这是正确的方法…Eeek,对不起,你能告诉我如何访问我的ENUM吗?我已经设置好了,但还是可以通过switch语句访问它?只要我输入‘hero’,什么都不会发生,所以我是否也必须在这里声明一些静态的东西,或者我应该只更改为if-else?
开关(hero.killedBy()){case掉到屏幕上:{
当然,
hero.killedBy()
必须返回一个
HeroDeathCause
的实例。例如:
返回HeroDeathCause.HIT_BIRD;
case Hero.HITBIRD {
public enum HeroDeathCause {
    FELL_OFF_SCREEN, HIT_BIRD, SQUASHED
}