【问题标题】:Enum with int value in JavaJava中具有int值的枚举
【发布时间】:2010-12-13 12:14:45
【问题描述】:

C# 的 Java 等价物是什么:

enum Foo
{
  Bar = 0,
  Baz = 1,
  Fii = 10,
}

【问题讨论】:

  • 我对 Java 感到尴尬的是,具有不同 int 值的枚举不仅可以工作。

标签: c# java enums


【解决方案1】:

如果你有一个连续的值范围,而你只需要整数值,你可以至少声明枚举:

public enum NUMBERZ {
        ZERO, ONE, TWO
}

然后获取int值如下:

int numberOne = NUMBERZ.ONE.ordinal();

但是,如果您需要一个不连续的范围(如在您的示例中,您从 1 跳转到 10),那么您将需要编写自己的枚举构造函数来设置您自己的成员变量,并为该变量提供一个 get 方法,如此处其他答案中所述。

【讨论】:

    【解决方案2】:
    public enum Foo {
        Bar(0),
        Baz(1),
        Fii(10);
    
        private final int someint;
        Foo(int someint) {
            this.someint = someint;
        }
    }
    

    在 Java 中,枚举与其他类非常相似,但 Java 编译器知道在各种情况下会有所不同。因此,如果您想要其中的数据,就像您认为的那样,您需要有一个数据的实例变量和一个适当的构造函数。

    【讨论】:

      【解决方案3】:

      如果你想要 enum 的属性,你需要像这样定义它:

      public enum Foo {
          BAR (0),
          BAZ (1),
          FII (10);
      
          private final int index;   
      
          Foo(int index) {
              this.index = index;
          }
      
          public int index() { 
              return index; 
          }
      
      }
      

      你会这样使用它:

      public static void main(String[] args) {
          for (Foo f : Foo.values()) {
             System.out.printf("%s has index %d%n", f, f.index());
          }
      }
      

      要意识到enum 只是创建类的快捷方式,因此您可以向该类添加任何您想要的属性和方法。

      如果您不想在 enum 上定义任何方法,您可以更改成员变量的范围并将它们设为 public,但这不是他们在 example on the Sun website 中所做的。

      【讨论】:

      • +1 用于包含访问器 :) 请注意,要获取数值,您必须使用 Foo.BAR.index()
      • 还要注意,如果你想从 int 代码中获取枚举,你还应该添加一个静态方法来进行反向映射(使用开关或映射)。
      • @penpen - 一个开关很难维护;做地图,或者只是做线性搜索,还不错(除非是)
      • 我不会调用此索引,而是调用 val,例如此代码中 FII 的索引(序数)为 2(假设基于零的索引),而其值为 10。
      【解决方案4】:

      它是:

      enum Foo
      {
        Bar(0),
        Baz(1),
        Fii(10);
      
        private int index;
      
        private Foo(int index) {
            this.index = index;
        }
      }
      

      请注意,要从索引中获取枚举值,Foo.valueOf(1) (*) 是行不通的。您需要自己编写代码:

      public Foo getFooFromIndex(int index) {
          switch (index) {
          case 0:
              return Foo.Bar;
          case 1:
              return Foo.Baz;
          case 10:
              return Foo.Fii;
      
          default:
              throw new RuntimeException("Unknown index:" + index);
          }
      }
      

      (*): Enum.valueOf() 从字符串返回枚举。因此,您可以通过Foo.valueOf('Bar') 获得值 Bar

      【讨论】:

      • 而不是那种手工编码的方法,懒惰地初始化一个 Map。 (例如使用 Google Collections 中的 Maps.uniqueIndex()。)
      • 可惜不能在 switch 中使用 Bar.index、Baz.index 等,因为它们不是常量表达式。
      【解决方案5】:

      听起来你想要这样的东西:

      public enum Foo {
          Bar(0),
          Baz(1),
          Fii(10);
      
          private int number;
      
          public Foo(int number) {
             this.number = number;
          }
      
          public int getNumber() {
              return number;
          }
      }
      

      对于初学者来说,Sun 的 Java Enum Tutorial 将是了解更多信息的好地方。

      【讨论】:

      • 请记住,枚举类型的构造函数必须是包私有或私有访问,而不是公共访问。
      猜你喜欢
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 2015-03-02
      • 1970-01-01
      • 2020-01-30
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多