【问题标题】:How to assign enum variable to a numerical variable? Java如何将枚举变量分配给数值变量?爪哇
【发布时间】:2015-02-05 16:20:36
【问题描述】:

在这个扑克游戏代码中,我试图创建一个Card 类。但是,我想使用enum 类型而不是使用constant,因为我听说它更好。唯一的问题是我多次尝试将suitfaceValue 的实例值(它们是int 变量)分配给enum 类型变量,但它表示类型不兼容。怎么了?

public class Card {

    final static int MAX_SUITS = 4;
    final static int MAX_FACE_VALUES = 13;

    private int suit;
    private int faceValue;

    enum Suit {HEARTS, DIAMONDS, SPADES, CLUBS}
    enum Face {ACE, JACK, QUEEN, KING}

    public Card(int suit, int faceValue) {
        this.suit = suit;
        this.faceValue = faceValue;
    }

    public int getSuit() {
        if (suit == 0) {
            return suit = Suit.HEARTS; break;
        else if (suit == 1)
            return suit = Suit.DIAMONDS; break;
        else if (suit == 2)
            return suit = Suit.SPADES; break;
        else if (suit == 3)
            return suit = Suit.CLUBS; break;
    }

    public int getFaceValue() {
        if (faceValue == 1)
            return faceValue = Face.ACE; break;
         else if (faceValue == 11)
            return faceValue = Face.JACK; break;
         else if (faceValue == 12)
            return faceValue = Face.QUEEN; break;
         else if (faceValue == 13)
            return faceValue = Face.KING; break;
    }

    public void setFaceValue(int faceValue) {
        this.faceValue = faceValue;
    }

    public void setSuit(int suit) {
        this.suit = suit;
    }

    @Override
    public String toString() {
        if (suit > MAX_SUITS || faceValue > MAX_FACE_VALUES)
            return "invalid entry";
        else if((suit < 0 || faceValue < 0))
            return "invalid entry";
        else
            return faceValue + " of " + suit;
    }
}

【问题讨论】:

  • 您应该将构造函数从 public Card(int suit, int faceValue) { 更改为 public Card(Suit suit, Face faceValue) {...
  • @assylias 我说过,将它分配给一个数字变量而不改变它的类型!我希望下次你努力更好地阅读问题,而不是争先恐后地回答和评估。
  • @askd 我读了你的问题。我的观点是:您应该尝试完全摆脱 int:使用枚举的整个想法是您不再需要使用 int 常量。如果您继续使用整数,那么您就没有使用枚举的全部功能。您可能需要在整数和枚举之间进行转换的唯一情况是,如果您从外部源接收整数,例如数据文件。在这种情况下,枚举和整数之间存在映射模式,例如通过向枚举添加一个 int 构造函数。

标签: java enums int


【解决方案1】:

如何将枚举变量分配给数值变量?

你不能。您必须将所有int(代表西装时)的用法重构并更改为Suit

【讨论】:

    【解决方案2】:

    我犹豫是否写这个答案,因为它违背了枚举的全部目的,并且在int 值和enum 常量之间创建任何形式的“映射”是没有意义的 .

    只是不要这样做。

    按照其他人的建议:将您的 int 值替换为相应的 enum 常量。那么你也不需要MAX_SUITS等这些丑陋的解决方法。

    Card 类的一个(相对)干净的实现如下所示:

    public class Card {
    
        public static void main(String[] args)
        {
            Card c0 = new Card(Suit.HEARTS, Face.ACE);
            Card c1 = new Card(Suit.DIAMONDS, Face.QUEEN);
            System.out.println(c0);
            System.out.println(c1);
        }
    
        private final Suit suit;
        private final Face face;
    
        enum Suit {HEARTS, DIAMONDS, SPADES, CLUBS}
        enum Face {ACE, JACK, QUEEN, KING}
    
        public Card(Suit suit, Face face) {
            this.suit = suit;
            this.face = face;
        }
    
        public Suit getSuit() {
            return suit;
        }
    
        public Face getFace() {
            return face;
        }
    
        @Override
        public String toString() {
            return getFace() + " of " + getSuit();
        }
    }
    

    但是,仍然要回答这个问题:可以使用内置方法在 intenum 值之间建立映射。您可以使用Enum#ordinal 方法获取int,使用(隐式)Enum#values 方法获取可以使用int 作为索引访问的常量数组。

    所以不推荐的实现方式可能是这样的:

    public class Card {
    
        public static void main(String[] args)
        {
            Card c0 = new Card(Suit.HEARTS.ordinal(), Face.ACE.ordinal());
            Card c1 = new Card(Suit.DIAMONDS.ordinal(), Face.QUEEN.ordinal());
            System.out.println(c0);
            System.out.println(c1);
        }
    
        final static int MAX_SUITS = 4;
        final static int MAX_FACE_VALUES = 13;
    
        private int suit;
        private int faceValue;
    
        enum Suit {HEARTS, DIAMONDS, SPADES, CLUBS}
        enum Face {ACE, JACK, QUEEN, KING}
    
        public Card(int suit, int faceValue) {
            this.suit = suit;
            this.faceValue = faceValue;
        }
    
        public int getSuit() {
            return suit;
        }
    
        public int getFaceValue() {
            return faceValue;
        }
    
        public Suit getSuitEnum() {
            return Suit.values()[suit];
        }
    
        public Face getFaceValueEnum() {
            return Face.values()[faceValue];
        }
    
        public void setFaceValue(int faceValue) {
            this.faceValue = faceValue;
        }
    
        public void setSuit(int suit) {
            this.suit = suit;
        }
    
        @Override
        public String toString() {
            if (suit > MAX_SUITS || faceValue > MAX_FACE_VALUES)
                return "invalid entry";
            else if((suit < 0 || faceValue < 0))
                return "invalid entry";
            else
                return getFaceValueEnum() + " of " + getSuitEnum();
        }
    }
    

    编辑:我猜混淆来自于您想将“面值”存储为枚举的事实,并且只有 一些 面值的枚举常量(而其他只是int,从 2 到 10)。这么说吧:将面值存储为枚举可能不是一个好主意...

    【讨论】:

      【解决方案3】:

      另一种不推荐的方式来做你想做的事: (我只是临时编写了这段代码并没有运行它,所以对任何错字表示歉意):

      public enum Suit {
      
        HEARTS( 1 ),
        DIAMONDS( 2 ),
        SPADES( 3 ),
        CLUBS( 4 );
      
        private int id = -1;
      
        public Suit( int id ) {
          this.id = id;
        }
      
        public int getId() {
          return id;
        }
      
        public static Suit parse( int suitId ) {
          for( Suit s : values() ) {
            if( s.getId() == suitId ) {
              return s;
            }
          }
          return null;
        }
      }
      
      
      
      public enum Face {
      
        ACE( 11 ),
        JACK( 12 ),
        QUEEN( 13 ),
        KING( 14 );
      
        private int val = -1;
      
        public Face( int val ) {
          this.val = val;
        }
      
        public int getVal() {
          return val;
        }
      
        public static Face parse( int faceVal ) {
          for( Face f : values() ) {
            if( f.getVal() == faceVal ) {
              return f;
            }
          }
          return null;
        }
      }
      
      
      public class Card {
      
          final static int MAX_SUITS = 4;
          final static int MAX_FACE_VALUES = 13;
      
          private Suit suit;
          private Face faceValue;
      
          public Card(int suit, int faceValue) {
              setSuit( suit );
              setFaceValue( faceValue );
          }
      
          public int getSuit() {
              return suit.getId();
          }
      
          public int getFaceValue() {
              return face.getVal();
          }
      
          public void setFaceValue(int faceValue) {
              this.faceValue = Face.parse( faceValue );
          }
      
          public void setSuit(int suit) {
              this.suit = Suit.parse( suit );
          }
      
          ...
      }
      

      但在这种情况下,您基本上将枚举用作整数存储。 Card 上的外部 actor 基本上只根据整数与其交互,因此使用枚举纯粹是内部的,在这里有点毫无意义。

      关于您对getSuit()getFaceValue() 的初始实现的另一点-我认为您可能打算在那里使用一个开关(break 对那些if/else 没有太大影响) :

      Suit returnVal;
      
      switch( suit ) {
        case 0: returnVal = Suit.HEARTS; 
                break;
        case 1: returnVal = Suit.DIAMONDS; 
                break;
        case 2: returnVal = Suit.SPADES; 
                break;
        case 3: returnVal = Suit.CLUBS; 
                break;
        default: returnVal = null;
                 break;
      }
      
      return returnVal;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-20
        • 2016-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-01
        • 2016-04-09
        相关资源
        最近更新 更多