2

关于我的扑克 Java 程序,选择枚举而不是字符和整数是一个明智的决定吗?

据我所知,将单独的整数值分配给 char 具有在比较卡片值以确定获胜者时易于应用数学运算符的好处。但是,如果是这样,我不知道枚举可能会这样做。

请有人可以向我解释每个的 adv/disadv 吗?

我声明卡等级的第一个选择是枚举:

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) 
}

我的第二个选项是作为静态最终字符分配 int 值,如下所示:

       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;
             }
         }

谢谢!

4

4 回答 4

5

我宁愿Enum. 代码看起来更简洁,IDE 可以帮助您避免在switch语句中遗漏大小写。

于 2013-01-09T20:39:31.843 回答
4

我建议你阅读Joshua Bloch 的 Effective Java 中的Item 30: Use enums instead of int constants。它解释了使用枚举而不是 int 常量的许多优点。

于 2013-01-09T20:42:54.543 回答
2

使用枚举。因为:

  • 风格 - 它们看起来更好更干净
  • IDE 集成 - IDE 可以提示您进行有效输入
  • 方法可以传递枚举,这些枚举会自动进行范围检查(见下文)
  • 枚举可以具有返回值和/或进行计算的方法
  • 您正在处理的数据具有永远不会改变的明确值范围,因此为每个值定义一个枚举实例是有意义的

考虑这种方法:

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

我可以用无效输入调用它

addCards('x', '$');

没有内置的范围检查char。但是使用枚举,它是免费的。


至于你的排名问题,使用枚举你可以简单地做到这一点

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

您定义枚举实例的顺序足以传达排名顺序。

于 2013-01-09T20:48:24.813 回答
0

枚举有一个序数(从 0 开始)。因此,您可以使用它对它们进行排名,并且您可能不应该重复它。例如 KING.ordinal()。

另外,顺便说一句,扑克套装没有等级 - 你的套装按桥牌顺序排列。

于 2013-01-09T20:42:32.067 回答