【问题标题】:How to convert enum value to int?如何将枚举值转换为int?
【发布时间】:2011-12-30 18:15:58
【问题描述】:

我有一个返回 int 类型的函数。但是,我只有一个 TAX 枚举值。

如何将 TAX 枚举值转换为 int?

public enum TAX {
    NOTAX(0),SALESTAX(10),IMPORTEDTAX(5);

    private int value;
    private TAX(int value){
        this.value = value;
    }
}

TAX var = TAX.NOTAX; // This value will differ

public int getTaxValue()
{
  // what do do here?
  // return (int)var;
}

【问题讨论】:

标签: java enums


【解决方案1】:

你需要让枚举以某种方式暴露value,例如

public enum Tax {
    NONE(0), SALES(10), IMPORT(5);

    private final int value;
    private Tax(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

...

public int getTaxValue() {
    Tax tax = Tax.NONE; // Or whatever
    return tax.getValue();
}

(顺便说一句,我已将名称更改为更传统和可读性。)

这是假设您想要在构造函数中分配的值。如果这不是您想要的,您需要向我们提供更多信息。

【讨论】:

  • @likejiujitsu:这是相反的方向。在这个问题中,OP 已经一个Tax 类型的值,并希望从中获取数值。
  • 我刚试了一下,发现它失败了myEnumValue = MyEnum.valueOf(myInt); arg 必须是 String 类型 - 还是我遗漏了什么?
  • 这个解决方案比没有更糟糕。似乎不应该使用 Java 中的枚举?还是 JDK 1.8 改变了这一点?
  • @ebyrob:鉴于投票,似乎很多人不同意你的观点,就像我一样。如果你想要一组固定的值,枚举绝对没问题。
  • @ebyrob 在谈论解决方案之前,您应该先看看是谁回答了它 - 所以上帝 Jon Skeet 本人!!
【解决方案2】:

我更喜欢这个:

public enum Color {

   White,

   Green,

   Blue,

   Purple,

   Orange,

   Red
}

然后:

//cast enum to int
int color = Color.Blue.ordinal();

【讨论】:

  • Joshua Bloch 在他的《Effective Java》(第 2 版)一书中不正确/不建议这样做。见第 31 条。
  • @user504342 我没有这本书的第 2 版,请问您能告诉我们为什么不推荐它的要点吗?
  • 两个原因:一,如果添加新常量,序数值和常量之间的任何关联都会中断,并且有两个 API 文档特别建议不要这样做。
  • 如此干净和完美。我看到一些“不要这样做”和“不推荐”。我将不得不研究为什么它被认为是不好的。一些臃肿的样本看起来很糟糕 IMO。完成这么简单的任务需要做很多工作。
  • 在一个团队中,你很确定你的合作开发者会在中间添加一个值(一开始更糟糕),或者只是对它们进行排序,因为它们无事可做并且完全混乱代码使用.ordinal()
【解决方案3】:

如果你想要你在构造函数中分配的值,你需要在枚举定义中添加一个方法来返回那个值。

如果你想要一个代表枚举值的唯一数字,你可以使用ordinal()

【讨论】:

  • 小心。依赖ordinal() 的开发反模式比ordinal() 的有效用例多得多。如果您需要为enum 存储唯一值,则只需存储enum。有 EnumSets、Enums 列表、EnumMaps 以及您可能想要的几乎任何其他 Enum 集合。
  • @EdwinBuck:很好地指出,我只是想提一下ordinal() 的存在,因为 OP 没有明确说明他想要 int 实际上是什么。
  • 不要使用序数。请检查有关此的枚举 api。已删除赞成票。
  • 我想知道人们对在枚举本身内部使用ordinal() 有何看法。例如,假设我有一个名为“Season”的枚举,其中包含值SpringSummerAutumnWinter,它有一个名为next() 的公共方法,它返回values()[(ordinal() + 1) % 4]在外部,没有代码看到序数,并且这个枚举中永远不会有其他成员,所以它似乎是一个有效的用例。
  • @DarrelHoffman 我的感觉是这样做很好,因为我认为反对使用ordinal() 的唯一强有力的论据取决于对枚举枚举常量的更改破坏了遥远的代码。如果您要修改枚举的常量,您必须已经在该文件中。大多数枚举都相当短,如果不是,您应该更彻底地检查文件。在这两种情况下,您都应该有一个单元测试来覆盖您的 next() 方法。
【解决方案4】:

有时一些 C# 方法使 Java 世界的生活更轻松..:

class XLINK {
static final short PAYLOAD = 102, ACK = 103, PAYLOAD_AND_ACK = 104;
}
//Now is trivial to use it like a C# enum:
int rcv = XLINK.ACK;

【讨论】:

  • 对我来说这是最理想的方式。我得到了 enum(代码清晰)的好处,这是一种对 DB 友好的数据类型,而且我不必研究 100 个 enum 替代方案来以“android 方式”进行操作。简单有效。
  • 不错。就好像 java 枚举与枚举的实际用途完全脱节......特别是如果人们开始滥用它来处理单例等事情。这种方法确实有一个缺点,它没有一种简单的方法来获取所有值。
  • 这难道没有尝试将枚举值传递给方法的缺点吗?您不能再将 XLINK 传递给方法,因为它不代表任何具体的东西。你失去了输入你的方法。方法签名必须读短而不是 XLINK。
【解决方案5】:

也许使用字符串表示比使用整数更好,因为如果将值添加到枚举中,字符串仍然有效。您可以使用枚举的 name() 方法将枚举值转换为字符串,并使用枚举的 valueOf() 方法再次从字符串创建枚举表示。下面的例子展示了如何将枚举值转换为字符串并返回(ValueType 是一个枚举):

ValueType expected = ValueType.FLOAT;
String value = expected.name();

System.out.println("Name value: " + value);

ValueType actual = ValueType.valueOf(value);

if(expected.equals(actual)) System.out.println("Values are equal");

【讨论】:

    【解决方案6】:
    public enum Tax {
    
    NONE(1), SALES(2), IMPORT(3);
    
    private final int value;
        private Tax(int value) {
            this.value = value;
        }
    
        public String toString() {
            return Integer.toString(value);
        }
    }
    
    class Test {
        System.out.println(Tax.NONE);    //Just an example.
    }
    

    【讨论】:

      【解决方案7】:

      一种稍微不同的方法(至少在 Android 上)是使用 IntDef 注释来组合一组 int 常量

      @IntDef({NOTAX, SALESTAX, IMPORTEDTAX})
      @interface TAX {}
      int NOTAX = 0;
      int SALESTAX = 10;
      int IMPORTEDTAX = 5;
      

      用作函数参数:

      void computeTax(@TAX int taxPercentage){...} 
      

      或在变量声明中:

      @TAX int currentTax = IMPORTEDTAX;
      

      【讨论】:

        【解决方案8】:
        public enum ProfileType {
        PRIVATE,
        PUBLIC
        }
        
        private ProfileType profileType = ProfileType.PRIVATE;
        

        如果你想从 profileType 获取 int,你可以简单地做:

        int profileTypeInt = profileType.ordinal();

        【讨论】:

          猜你喜欢
          • 2010-09-06
          • 1970-01-01
          • 2013-08-03
          • 1970-01-01
          • 1970-01-01
          • 2013-06-02
          • 1970-01-01
          相关资源
          最近更新 更多