Объркване в оператора на Java Switch

В моето приложение (което е игра за 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 изразите трябва да бъдат постоянни изрази

Очевидно, за четливост бих предпочел да използвам имената на променливите, които съм задал, вместо необработените числени стойности......


person Zippy    schedule 02.11.2014    source източник
comment
Проверете това stackoverflow.com/questions/3827393/   -  person Boris Ivanov    schedule 02.11.2014
comment
Благодаря @BorisIvanov, прочетох набързо. Не съм сигурен, че разбирам какво се има предвид под „използване на инициализатор“? Това означава ли - декларирайте го като (например) int FELLOFFSCREEN и след това го задайте някъде - така че FELLOFFSCREEN = 0? Ако случаят е такъв, предполагам, че не мога да използвам последната ключова дума? - Благодаря   -  person Zippy    schedule 02.11.2014
comment
Можете ли да опитате първо public final static int XXX = 1; или ENUM?   -  person Boris Ivanov    schedule 02.11.2014
comment
Благодаря, @BorisIvanov, мисля да мина с enum :-)   -  person Zippy    schedule 02.11.2014


Отговори (2)


Можете да използвате константи само в случаи. Вашите променливи са променливи на екземпляри, а не константи. Всеки герой има копие на тези променливи. Те трябва да бъдат декларирани като:

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

И трябва да имате достъп до тях, като използвате името на класа, а не обекта:

case Hero.HITBIRD {

(ако приемем, че името на класа е Hero).

Имайте предвид, че вероятно трябва да замените тези константи с enum:

public enum HeroDeathCause {
    FELL_OFF_SCREEN, HIT_BIRD, SQUASHED
}

Това е по-безопасно за типа и по-самоописателно.

person JB Nizet    schedule 02.11.2014
comment
Здравей JBNizet - благодаря за това, да, използвам enums в други части на моя код, така че мисля, че това е начинът да отида.... - person Zippy; 02.11.2014
comment
Eeek, съжалявам, бихте ли могли да покажете как ще получа достъп до моя enum? Настроих го, но отново мога да осъществя достъп до него чрез командата switch? веднага щом напиша "герой". нищо не се случва, така че трябва ли да декларирам нещо статично и тук или трябва просто да променя на if-else? - person Zippy; 02.11.2014
comment
switch (hero.killedBy()) { case FELL_OFF_SCREEN: { Разбира се, hero.killedBy() трябва да върне екземпляр на HeroDeathCause. Например: return HeroDeathCause.HIT_BIRD; - person JB Nizet; 02.11.2014

Направете своите int константи статични:

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

Като константи на класа, наличните и известни стойности преди да се създаде екземпляр на Hero.


Въпреки това, поради тези причини бих направил това enum и или ще го включа, или ще имам методи в enum за какво действие да вземе, когато героят умре поради това, като по този начин избягва напълно превключването.

person Bohemian♦    schedule 02.11.2014