【问题标题】:Which is more appropriate for static data - final char or enum?哪个更适合静态数据 - final char 或 enum?
【发布时间】:2012-12-24 03:17:39
【问题描述】:

关于我的扑克 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;
             }
         }

谢谢!

【问题讨论】:

    标签: java enums char int poker


    【解决方案1】:

    我更喜欢Enum。代码看起来更简洁,IDE 可以帮助您避免在 switch 语句中遗漏一个案例。

    【讨论】:

    • +1。而且您不再需要 switch 语句,因为您可以用多态性替换它们。
    • @JB Nizet:我不是说从静态版本切换。我的意思是,如果您需要在代码中的某处使用 switch 语句,IDE 可能会帮助您在使用 Enums 时避免错误。
    【解决方案2】:

    使用枚举。因为:

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

    考虑这种方法:

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

    我可以用无效输入调用它

    addCards('x', '$');
    

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


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

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

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

    【讨论】:

    • 很好的答案,我喜欢内置范围检查的事实,并且如您所说,对变量进行固定表示是有意义的——它们永远不会改变或应该改变。根据您的说法,排序枚举应该足以传达排名顺序,从高牌到皇家同花顺的每个手牌等级的所有牌组合都可能吗?我可能会就此提出另一个问题,因为这是我目前主要关心的问题。非常感谢!
    【解决方案3】:

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

    【讨论】:

    • 谢谢,我得到了一份副本,如果有点拖延,它似乎相当有用。感谢您的参考!
    • @silverzx 这是每个 Java 开发人员都应该阅读的一本书
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2010-11-09
      相关资源
      最近更新 更多