Перечислить enum-экземпляры с циклом

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

Пишу

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.

person Aaron J Lang    schedule 29.12.2011    source источник
comment
Возможно, enum — это не то, что вам нужно. Вам действительно нужно называть тройку треф CLUBS_3?   -  person Paul    schedule 29.12.2011
comment
Да, абсолютно -- частный конструктор, отдельные перечисления для SUIT и FACE.   -  person Ernest Friedman-Hill    schedule 29.12.2011


Ответы (3)


Я не думаю, что это можно сделать с помощью 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++;
            }
        }
      }
}

EDIT: установите 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
person dku.rajkumar    schedule 29.12.2011
comment
Я бы использовал перечисления для костюма и лица, но я думаю, что общедоступная коллекция только для чтения в сочетании с методом get(face, suit) - правильный путь. - person Aaron J Lang; 30.12.2011
comment
вы можете сделать это в любом случае (используя enum или простой класс для карты), см. метод: public static Card instance(Rank rank, Suit suit)... в stackoverflow.com/questions/8626670/ - person Ray Tayek; 30.12.2011

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

person Arash    schedule 29.12.2011
comment
Мне все равно пришлось бы перечислять все 52 карты вручную, чего я пытаюсь избежать. Я хочу уменьшить количество исходников для облегчения понимания и т.д. - person Aaron J Lang; 30.12.2011