2011-12-29 24 views
5

Kịch bản:
Tôi muốn có một enum chứa tất cả các thẻ bài trong một tầng chuẩn. Ví dụ này bỏ qua những câu nói đùa.Liệt kê enum-instances với vòng

Viết

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

cảm thấy sai.

Tôi muốn để có thể làm điều gì đó như thế này

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

tôi đã xem xét xác định thẻ như là một lớp chứa phù hợp với khuôn mặt và lĩnh vực, nơi phù hợp và khuôn mặt là bản thân sự đếm. Tuy nhiên, trong các tình huống khác (chẳng hạn như joker có bộ quần áo màu đỏ và đen), điều này sẽ cho phép tạo ra các đối tượng thẻ không hợp lệ (ví dụ: joker kim cương hoặc 10 màu đỏ).

Tự trả lời:
Dường như tôi không có đủ đại diện để đăng câu trả lời cho câu hỏi của riêng tôi.

 
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

Có lẽ một 'enum' không phải là thứ bạn muốn. Bạn có thực sự cần phải tham khảo 3 câu lạc bộ như CLUBS_3 không? – Paul

+0

Có, hoàn toàn - xây dựng tư nhân, enums riêng biệt cho SUIT và FACE. –

Trả lời

1

Tôi không nghĩ rằng nó có thể được thực hiện bằng enum nhưng chúng ta có thể implementclass như enum. bạn có thể làm một cái gì đó như dưới đây.

Triển khai:

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: thiết lập counter của thẻ. Trước đó nó sẽ ném NullPointerException cho chỉ số hơn 15.

USAGES:

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

OUTPUT:

face of the card:7 
suit of the card:3 
+0

Tôi muốn sử dụng enums cho phù hợp và khuôn mặt, nhưng tôi nghĩ rằng một bộ sưu tập chỉ đọc công cộng kết hợp với một phương pháp nhận được (mặt, phù hợp) là đúng cách để đi. –

+0

bạn có thể làm điều đó theo cách (sử dụng enum hoặc lớp đơn giản cho một thẻ) xem phương thức: public static Card instance (Xếp hạng thứ hạng, Suit suit) ... trong http://stackoverflow.com/questions/8626670/java- enum-or-encoding-with-numbers/8627079 # 8627079 –

0

tôi sẽ nói làm cho hai enums: một cho từng khuôn mặt, và một cái khác cho mỗi thẻ. Vì vậy, trong Thẻ Enum, mỗi enum có hai thuộc tính: số lượng thẻ (bạn có thể tạo một enum khác nếu bạn không cảm thấy sử dụng số đơn giản cho mục đích này), và khuôn mặt đó là một thể hiện của enum mặt. Điều đó sẽ giải quyết vấn đề.

+0

Tôi vẫn phải liệt kê tất cả 52 thẻ theo cách thủ công, đó là những gì tôi đang cố gắng tránh. Tôi muốn giảm số lượng nguồn để dễ hiểu hơn ... –

0

tôi đã sử dụng enum để xếp hạng, phù hợp và thẻ có vẻ hoạt động khá tốt. xem câu trả lời này cho mã: Java: Enum or encoding with numbers?

+0

Tome của ngón tay đau bạn liên kết đến là chính xác những gì tôi đang cố gắng để tránh –

Các vấn đề liên quan