2013-06-29 5 views
1

Я пытаюсь создать систему типа иерархии, используя Enum. Раньше я никогда не использовал Enum.Java - Использование «this» в Enums?

Этот метод всегда возвращает крестьянина. Я думаю, это потому, что я использую «это» неправильно, или, может быть, я неправильно понимаю перечисления.

public enum Rank { 
    PEASANT, 
    TRADER, 
    SQUIRE, 
    MERCHANT, 
    KNIGHT, 
    NOBLE, 
    KING; 

    public Rank getNextRank() { 
     switch (this) { 
     case PEASANT: 
      return SQUIRE; 
     case SQUIRE: 
      return KNIGHT; 
     case KNIGHT: 
      return NOBLE; 
     case NOBLE: 
      return KING; 
     case KING: 
      return PEASANT; 
     } 
     return PEASANT; 
    } 
} 

(я понимаю, что дело KING не надо, но мне нравится это для удобства чтения)

Я хотел Rank.PEASANT.getNextRank() вернуться Rank.SQUIRE и Rank.NOBLE.getNextRank() вернуть Rank.KING и т.д.

+0

Ваш метод прекрасно работает. –

+0

Ваш метод работает. Пожалуйста, отправьте код, в котором вы его вызываете ... – Thihara

+0

@Baadshah Я так не верю. Я получил Rank.PEASANT для Rank.SQUIRE.getNextRank() – fruitcup

ответ

1

Я не могу передать комментарии, это его рабочий тон. Пожалуйста, см. Рис.

Проверьте поток снова. Проблема лежит где-то еще.

System.out.println(Rank.SQUIRE.getNextRank()); //printed KNIGHT 

enter image description here

+0

Ах, вы правы ... проблема в чем-то совсем другом, и это выходит за рамки любого вопроса, который я должен задать здесь. Спасибо – fruitcup

+1

@DrAgonmoray Случается каждому программисту :) Рад, что я мог бы вам помочь :) –

2

Ну что код должен работы, но я бы лично просто использовать ordinal():

public Rank getNextRank() { 
    Rank[] allRanks = Rank.values(); 
    return allRanks[(ordinal() + 1) % allRanks.length]; 
} 

Вы можете избежать вызова Rank.values() (который создает новый массив для каждого вызова), если вы используете статическое конечное поле в перечислении, которое установлено в Rank.values() в статическом блоке инициализации.

Было бы неплохо, если бы вы могли передать «следующий ранг» в конструктор перечисления и сохранить его как поле, но это не работает в этом случае, поскольку вы эффективно используете прямую ссылку каждый раз. Вы могло иметь не последнее поле, и установите значения в статическом инициализаторе, конечно:

public enum Rank { 
    PEASANT, 
    TRADER, 
    SQUIRE, 
    MERCHANT, 
    KNIGHT, 
    NOBLE, 
    KING, 

    private Rank next; 

    static { 
     PEASANT.next = TRADER; 
     TRADER.next = SQUIRE; 
     SQUIRE.next = MERCHANT; 
     MERCHANT.next = KNIGHT; 
     NOBLE.next = KING; 
     KING.next = PEASANT; 
    } 

    public Rank getNextRank() { 
     return next; 
    } 
} 

Это было бы более гибким, например, если вы хотите два «равные» занимает которые оба имели тот же «следующий» ранг.