代码之家  ›  专栏  ›  技术社区  ›  bogertron

枚举的表示

  •  1
  • bogertron  · 技术社区  · 16 年前

    枚举如何在编程语言中“幕后”工作?我猜每种语言都有不同的方式来表示这些数据类型。

    在java中,可以使用==运算符,例如:

    public class TestEnum {
       private enum Test {
          foo, bar
       }
    
       public static void main(String[] args) {
          System.out.println(Test.foo == Test.foo); // returns true
       }
    }
    

    5 回复  |  直到 16 年前
        1
  •  2
  •   Hank Gay    16 年前

    JAVA enum 让我们利用 许多 == . 原著 typesafe enum pattern (另见 )可以提供一些见解,但是 Enum.java source 我会告诉你他们现在是怎么做的。

        2
  •  1
  •   dfa    16 年前

    Java中的枚举类型实际上是一个特殊的编译器生成的类,而不是算术类型:枚举值作为全局预生成实例来比较引用,以代替 equals .

      Code:
        0:   getstatic       #2; //Field YourEnum.BAR:LYourEnum;
        3:   getstatic       #3; //Field YourEnum.FOO:LYourEnum;
        6:   if_acmpne       17    
    

    它应该大致相当于以下Java代码:

    enum YourEnum {
        FOO,
        BAR
    }
    
    // ...
    if (YourEnum.BAR == YourEnum.FOO)
    

    字符串驻留 .

        3
  •  0
  •   Aaron    16 年前

    int 在幕后——尽管这当然不是要求。

    例如,在上面的示例中,编译器很可能意识到这两个值是相等的,而从未将它们转换为某种中间表示形式,只是发出一个 true

        4
  •  0
  •   Ali    16 年前

    我认为枚举只是常量整数。

    你有吗

    const int foo = 0;
    const int bar = 1;
    

        5
  •  0
  •   Robert Harvey    16 年前

    如果你这样做

    我通常更容易理解的是:

    public enum Test
        foo = 1
        bar = 2
    end enum
    

    尝试一下,用字符串更改1和2。这将引发编译器错误。