Путаница с оператором 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 не распознается? Почему это? Если я все равно наберу его (случай hero.HIITBIRD), я получу эту ошибку:

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
Можете ли вы попробовать первый публичный окончательный static int XXX = 1; или ЭНУМ?   -  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 {

(при условии, что имя класса - Герой).

Обратите внимание, что вам, вероятно, следует заменить эти константы перечислением:

public enum HeroDeathCause {
    FELL_OFF_SCREEN, HIT_BIRD, SQUASHED
}

Это более безопасно для типов и более информативно.

person JB Nizet    schedule 02.11.2014
comment
Привет JBNizet - спасибо за это, да, я использую перечисления в других частях моего кода, поэтому я думаю, что это правильный путь.... - person Zippy; 02.11.2014
comment
Eeek, извините, не могли бы вы показать, как я могу получить доступ к моему перечислению? Я настроил его, но опять же, я могу получить к нему доступ только через оператор 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.


Однако по этим причинам я бы сделал это перечислением и либо включил это, либо имел методы для перечисления какого действия взять, когда герой умирает из-за этого, таким образом избегая переключения вообще.

person Bohemian♦    schedule 02.11.2014