2009-12-07 70 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) 

爲了簡單起見,你可以把它作爲一個特殊的案件字串國際