枚举的表示

时间:2009-12-07 16:43:02

标签: enums implementation multiple-languages

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

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

public class TestEnum {
   private enum Test {
      foo, bar
   }

   public static void main(String[] args) {
      System.out.println(Test.foo == Test.foo); // returns true
   }
}

在==期间是否将枚举类型转换为基元?或者枚举值是单身人士吗? C#是否以与java相同的方式利用枚举?与编程语言相比,数据库枚举类型的处理方式是否不同?

5 个答案:

答案 0 :(得分:2)

Java enum使用 lot 技巧仍然是对象但与==一起使用。原始的typesafe enum pattern(另请参阅 Effective Java )可以提供一些见解,但Enum.java source会告诉您他们现在是如何做到的。

答案 1 :(得分:1)

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

您可以验证它是否正在反汇编.class文件:

  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)

为简单起见,您可以将其视为字符串实习的特例。

答案 2 :(得分:0)

我认为大多数语言会在幕后将枚举转换为int - 尽管这当然不是必需的。

例如 - 在上面的示例中,编译器当然可能会意识到这两个值是相等的,而不会将它们转换为某个中间表示,只会发出true值。

答案 3 :(得分:0)

.Net语言以整数的形式表示它们。 如果你这样做

如果1 == foo,则应返回true

我通常更容易理解的是:

public enum Test
    foo = 1
    bar = 2
end enum

尝试一下,用字符串更改1和2。这应该会给你一个编译错误。

答案 4 :(得分:0)

我认为枚举只是const整数。

所以你有

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

等等,编译器将命名空间'Test'添加到它们