Which is more appropriate for static data - final

2019-05-20 23:14发布

Relating to my Poker Java program would it be a wise decision to choose enum's over chars and ints?

As far as I can tell assigning a separate integer value to a char has the benefit of ease of mathematical operators being applied when it comes to comparing card values to decide a winner. However this may be possible with enums, if so I'm unaware.

Please can someone explain the adv/disadv of each to me?

My first option of declaring card ranks is as enums:

public enum Rank { 
     DEUCE (1), 
     THREE (2), 
     FOUR (3), 
     FIVE (4), 
     SIX (5),     
     SEVEN (6), 
     EIGHT (7), 
     NINE (8), 
     TEN (9), 
     JACK (10), 
     QUEEN (11), 
     KING (12), 
     ACE (13)
}

public enum Suit { 
     CLUBS (1), 
     DIAMONDS (2), 
     HEARTS (3), 
     SPADES (4) 
}

My second option is as static final chars with assigned int values as such:

       public static final char ACE =   'A';
       public static final char TWO =   '2';
       public static final char THREE = '3';
       public static final char FOUR =  '4';
       public static final char FIVE =  '5';
       public static final char SIX =   '6';
       public static final char SEVEN = '7';
       public static final char EIGHT = '8';
       public static final char NINE =  '9';
       public static final char TEN =   'T';
       public static final char JACK =  'J';
       public static final char QUEEN = 'Q';
       public static final char KING =  'K';

         public Rank (char c)
         {
             switch (c)
             {
             case TWO:
                 _val = 0;
                 break;
             case THREE:
                 _val = 1;
                 break;
             case FOUR: 
                 _val = 2;
                 break;
             case FIVE: 
                 _val = 3;
                 break;
             case SIX:
                 _val = 4;
                 break;
             case SEVEN:
                 _val = 5;
                 break;
             case EIGHT:
                 _val = 6;
                 break;
             case NINE: 
                 _val = 7;
                 break;
             case 'T':
                 _val = 8;
                 break;
             case 'J':  
                 _val = 9;
                 break;
             case 'Q':
                 _val = 10;
                 break;
             case 'K': 
                 _val = 11;
                 break;
             case 'A':
                 _val = 12;
                 break;
             default:
                 _val = -1;
             }
         }

Thanks!

4条回答
聊天终结者
2楼-- · 2019-05-20 23:41

I'd suggest you read Item 30: Use enums instead of int constants from Effective Java by Joshua Bloch. It explains the many advantages to using enums over int constants.

查看更多
时光不老,我们不散
3楼-- · 2019-05-20 23:55

Use enums. Because of:

  • style - they look better and cleaner
  • IDE integration - the IDE can prompt you for valid input
  • methods can be passed enums which are automatically imbued with range checking (see below)
  • enums can have methods to return values and/or do calculations
  • the data you're dealing with has a definite range of values that won't ever change, so defining an enum instance for each value makes sense

Consider this method:

public static char addCards(char a, char b);

I can call it with invalid input

addCards('x', '$');

There's no range checking built in with char. But with enums, it comes for free.


As for your issue of ranking, with enums you can simply do this

Rank r1, r2;
boolean r1RankedHigherThanR2 = r1.ordinal() > r2.ordinal();

The order you define the enum instances in is enough to convey ranking order.

查看更多
【Aperson】
4楼-- · 2019-05-20 23:58

I would prefer Enum. Code looks cleaner and IDEs may help you to avoid missing a case in switch statements.

查看更多
smile是对你的礼貌
5楼-- · 2019-05-21 00:03

Enums have an ordinal number (0-based). So you can use that to rank them and you probably shouldn't duplicate that. e.g. KING.ordinal().

Also, as an aside, in poker suits don't have a rank - you have your suits in bridge rank order.

查看更多
登录 后发表回答