Перечислять enum-экземпляры с помощью цикла - PullRequest
5 голосов
/ 29 декабря 2011

Сценарий:
Я хочу иметь перечисление, содержащее все игральные карты в стандартной колоде.В этом примере проигнорируйте джокеров.

Запись

enum Cards {
    SPADE_1(0, 1),
    SPADE_2(0, 2),
    etc.

кажется неправильной.

Я бы хотел сделать что-то подобное

enum Card {
    for (int suit=0; suit<4; suit++) {
        for (int face=1; face<13; face++) {
            new Card(suit, face);
        }
    }
}

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

Самоответ:
Очевидно, мне не хватает представителя, чтобы опубликовать ответ на свой вопрос.

I'm not sure if it's considered good form to answer my own question, but @Paul just gave me a brainwave.

Declare Card to have a private constructor, and use a
    static Card getCard(suit, face)
method to validate combinations before returning them.

Ответы [ 3 ]

1 голос
/ 29 декабря 2011

Я не думаю, что это можно сделать с помощью enum, но мы можем implement class как enum.Вы можете сделать что-то, как показано ниже.

Реализации:

public class Card {
    private int suit;
    private int face;

    private Card(int suit, int face){
        this.suit = suit;
        this.face = face;
    }

    public int getSuit(){
        return this.suit;
    }
    public int getFace(){
        return this.face;
    }
    public static Card[] cards = new Card[52];

      static{
        int counter =0;
        for (int i=0; i<4; i++) {
            for (int j=0; j<13; j++) {
               cards[counter] = new Card(i, j);
               counter++;
            }
        }
      }
}

РЕДАКТИРОВАТЬ: установить counter карты.Ранее было бы выброшено NullPointerException для индекса больше 15.

ИСПОЛЬЗОВАНИЕ:

System.out.println("face of the card:"+Card.cards[10].getFace());
System.out.println("suit of the card:"+Card.cards[10].getSuit());

ВЫХОД:

face of the card:7
suit of the card:3
0 голосов
/ 30 декабря 2011

Я использовал перечисление для ранга, масти и карты, которые, казалось, работали довольно хорошо. см. этот ответ для кода: Java: перечисление или кодировка с числами?

0 голосов
/ 29 декабря 2011

Я бы сказал, сделайте два перечисления: одно для каждого лица, а другое для каждой карты. Таким образом, в Card Enum каждое перечисление имеет два свойства: номер карточки (вы можете сделать еще одно перечисление, если вы не чувствуете, что используете простые числа для этой цели), и лицо, которое является экземпляром перечисления лица. Это должно решить проблему.

...