2009-12-07 71 views
1

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

在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一样使用枚举?与编程语言相比,数据库枚举类型的处理方式不同吗?

回答

2

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

0

我认为大多数语言在后台将enums转换为int--尽管这肯定不是必需的。

例如 - 在上面的例子中,编译器确实知道这两个值是相等的,没有将它们转换为某种中间表示形式,只是发出一个true值。

0

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

如果1 ==富,这应该返回true

我通常会更容易理解的是:

public enum Test 
    foo = 1 
    bar = 2 
end enum 

试试看,改变1 2与字符串。这应该会引发一个编译器错误。

0

我会认为枚举只是const整数。

所以你必须

const int foo = 0; 
const int bar = 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) 

为了简单起见,你可以把它作为一个特殊的案件字串国际