2016-12-20 13 views
3

Представьте себе следующий составленный пример:Java - Перечисления - Логическая круговая ссылка

public enum Hand { 
    ROCK(SCISSORS), 
    PAPER(ROCK), 
    SCISSORS(PAPER); 

    private final Hand beats; 

    Hand(Hand beats) { 
    this.beats = beats; 
    } 
} 

Я получаю сообщение об ошибке Illegal forward reference для переднего ссылающегося SCISSORS.


Есть ли способ обработки таких прямых ссылок на Java?

Или как бы вы могли моделировать такую ​​ситуацию, где у вас есть логическая циклическая ссылка между несколькими значениями перечислений?

+0

Какая ошибка? укажите – ItamarG3

+0

Обновлено с информацией об ошибке «Незаконная пересылка». – JDC

+0

Вы можете использовать 'switch' внутри метода. –

ответ

5

Вы не можете назначить SCISSORS до ROCK, прежде чем он будет определен. Вместо этого вы можете назначить значения в статическом блоке.

Я видел много примеров, когда люди используют значения String в конструкторах, но это более конкретное назначение фактических значений после их объявления. Это инкапсулировано, и переменная экземпляра beats не может быть изменена (если вы не используете отражение).

public enum Hand { 
    ROCK, 
    PAPER, 
    SCISSORS; 

    private Hand beats; 

    static { 
     ROCK.beats = SCISSORS; 
     PAPER.beats = ROCK; 
     SCISSORS.beats = PAPER; 
    } 

    public Hand getBeats() { 
     return beats; 
    } 

    public static void main(String[] args) { 
     for (Hand hand : Hand.values()) { 
      System.out.printf("%s beats %s%n", hand, hand.getBeats()); 
     } 
    } 
} 

Выход

ROCK beats SCISSORS 
PAPER beats ROCK 
SCISSORS beats PAPER 
+2

Почему это было запрещено? Это действительно хорошо для меня –

+1

Код перед редактированием не работал из-за модификатора 'final' в поле' beats'. – JDC

 Смежные вопросы

  • Нет связанных вопросов^_^