Java中带有int值的枚举

52

Java中相当于C#的是什么:

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

13
我其实为 Java 感到难堪,因为枚举类型如果具有不同的 int 值时,无法正常工作。 - Rhyous
5个回答

81
如果你想为你的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,但这不是 Sun 网站上的 example on the Sun website 中的做法。


2
请注意,要获取数值,您必须使用Foo.BAR.index()。如果包括访问器,可以加上+1。 - Matt H
请注意,如果您想从 int 代码获取枚举值,您还应该添加一个静态方法来执行反向映射(使用 switch 或 map)。 - penpen
@penpen - switch语句很难维护;使用映射表或者线性搜索会更好(除非必须使用switch语句)。 - Kevin Bourrillion
我不会称之为索引,而是称之为值,例如在这段代码中,FII的索引(序数)是2(假设从零开始索引),而其值为10。 - epeleg

15

如果您有一系列连续的值,而且您只需要整数值,则可以最小化声明枚举:

public enum NUMBERZ {
        ZERO, ONE, TWO
}

然后按以下方式获取int值:

int numberOne = NUMBERZ.ONE.ordinal();

然而,如果你需要一个不连续的范围(就像你的例子中,从1跳到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 这个枚举值。


3
与手动编码方式不同,可以懒惰地初始化一个Map<Foo,Integer>。(例如使用来自Google Collections的Maps.uniqueIndex()函数。) - Kevin Bourrillion
很遗憾,在switch语句中无法使用Bar.index、Baz.index等,因为它们不是常量表达式。 - Robert

2
听起来你需要像这样的东西:
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枚举教程将是一个学习更多的好地方。


2
请注意,枚举类型的构造函数必须是包私有或私有访问,而不是公共访问。 - Soundlink

0
public enum Foo {
    Bar(0),
    Baz(1),
    Fii(10);

    private final int someint;
    Foo(int someint) {
        this.someint = someint;
    }
}

在Java中,枚举类型与其他类非常相似,但Java编译器知道在各种情况下如何稍微特殊处理它们。因此,如果您希望在其中包含数据,您需要为数据创建一个实例变量和一个适当的构造函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接