【问题标题】:value of what the enum is currently set to枚举当前设置的值
【发布时间】:2013-05-17 21:30:53
【问题描述】:

这应该很明显,但事实并非如此。有没有办法像下面的示例那样获取枚举的值?

示例:

    public enum Numbers
    {
        zero, one, two

    }

//later on
Numbers numbers = Numbers.zero;
// this is the part that I can not figure out the java equivalent of?
int number = numbers.value();

这有意义吗?

【问题讨论】:

  • docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#ordinal() - 也就是说,这不是有用的信息。为什么需要知道?
  • ^^ "返回这个枚举常量的序数(它在它的枚举声明中的位置,初始常量的序数为零)。大多数程序员不会使用这个方法。"我在文档中看到了这个,但它看起来不像我需要的……是这样吗?
  • 好吧,既然真的没有枚举的“值”这样的东西,我不知道你需要什么。那将是最接近它的东西,因为它是一个表示排序的整数。
  • 我有一个枚举来跟踪在线程上运行的状态机,我需要将枚举的值作为整数集成到另一个使用 30 个常量 int 而不是一个枚举。 :(
  • 我建议您查看enum 上的 Oracle 教程 - 您需要为此定义自己的方案并提供一个 getter,而不是依赖于序数。

标签: java enums


【解决方案1】:

根据您的 cmets,您似乎需要将一个整数值映射到您的 enum 以将其集成到代码的另一部分中。

而不是依赖于您真正想要自己执行此操作的顺序:

public enum MyEnum {
    ZERO(0), ONE(1), TWO(2);

    private int mapping;

    MyEnum(int mapping) {
        this.mapping = mapping;
    }

    public int getMapping() {
        return mapping;
    }

} 

然后您可以通过以下方式进行比较:

MyEnum e = MyEnum.ZERO;
if (someInt == e.getMapping()) { ... } 

(或者甚至只是MyEnum.ZERO.getMapping()

【讨论】:

  • 我对每个人都投了赞成票,因为他们都是有效的答案,但是您是第一个开始提供帮助的人,我感谢您的帮助,所以我接受了您的帮助。
【解决方案2】:

通常认为依赖ordinal 是不好的做法,因为它基于enum 常量的顺序。更好的解决方案是将信息传递给每个实例。只需像这样编写一个构造函数和方法:

public enum Number {
    ZERO(0), ONE(1), TWO(2);

    private int value;

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

    public int value() {
        return value;
    }
};

然后你就随心所欲地使用它

Number numbers = Number.ZERO;
int number = numbers.value();

如果您稍后添加Numbers,您将不必担心代码的实际顺序。

注意:在 Java 中,enum 名称为单数而常量为大写是惯用的。

【讨论】:

    【解决方案3】:

    这取决于你需要什么。以下是 2 个用例:

    1) 您可能需要测试传入“数字”的值。对于这个用例,switch case 是最好的解决方案。

    void myMethod(Numbers n){
    
      switch(n){
        case zero:
        //do something
        break;
    
        case one:
        //do something
        break;
    
        //etc.
      }
    }
    

    2) 您还可以需要为每个数字分配一个值并能够检索它。对于这个用例,你可以为你的枚举定义一个构造函数

    public enum Numbers
    {
        zero(0), one(1), two(2);
    
        private int value;
    
        private Numbers(int value){
          this.value=value;
        }
    
    }
    

    然后,在你的代码中,你可以得到这个值:

    void myMethod(Numbers n){
      int value = n.getValue();
      //do something with this value...
    }
    

    最后一句话:您的枚举名称不遵循 java 约定。它们应该用大写字母命名,最后用字符“_”命名。例如:一、二、三、ANOTHER_VALUE

    【讨论】:

      【解决方案4】:

      您可以使用ordinal() 方法。但是,这是不鼓励/有风险的,因为如果您更改枚举的顺序或排列,它将失败。例如,您更改为 2 的幂

      public enum Numbers {
         zero, one, two, four
      }
      

      那么four.ordinal() 将是3。

      如果你真的想要一个与枚举关联的数字,你应该定义你自己的方法,例如order() 或其他。在初始实现中,它可能会返回 ordinal(),但是,当您将来添加 four 时,您可以更新该方法。

      附言标准样式是将枚举大写,例如零、一等...

      【讨论】:

      • 谢谢,这正是我所需要的。我使用的实际 emun 不是零、一、二、三,而是 30 种不同的状态,至少在我的部分中,这个枚举的顺序永远不会改变。
      • 理想情况下我仍然会定义一个方法int state(),但使用序数是可以容忍的。
      猜你喜欢
      • 2011-11-14
      • 2016-08-20
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多