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