2009-12-07 7 views
1

Как enums работают «за кулисами» на языках программирования? Я предполагаю, что каждый язык имеет другой способ представления этих типов данных.Представление перечислений

В Java вы можете использовать оператор ==, например:

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

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

Является перечисление преобразуется в примитив во время ==? Или это значение перечисления Singleton? Использует ли C# рефералы так же, как java? Являются ли типы перечислений базы данных обработанными по-разному по сравнению с языками программирования?

ответ

2

Java enum ы делают использование много трюков по-прежнему являются объектами, но работа с ==. Оригинал typesafe enum pattern (см. Также Эффективная Java) может дать некоторое представление, но Enum.java source покажет вам, как именно они это делают сейчас.

0

Я думаю, что большинство языков конвертирует enums в int за кулисами - хотя это, безусловно, не является обязательным требованием.

Например, в приведенном выше примере, конечно, возможно, что компилятор понимает, что эти два значения равны, не превращая их в какое-либо промежуточное представление и просто испускает значение true.

0

. Чистый язык представляет их в виде целых чисел. Если вы

Если 1 == Foo, это должно вернуть истинное

То, что я обычно будет легче понять это:

public enum Test 
    foo = 1 
    bar = 2 
end enum 

Дайте ему попробовать, изменить 1 и 2 со строками. Это должно вызвать ошибку компилятора.

0

Я думаю, что перечисления - это просто целые числа.

поэтому у вас есть

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

и так далее с компилятором добавления пространства имен «Test» им

1

Тип перечисления в Java на самом деле является специальным классом, сгенерированным компилятором, а не арифметическим типом: значения enum ведут себя как глобальные предварительно сгенерированные экземпляры, чтобы сравнить ссылки вместо 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) 

Ради простоты вы можете думать, это как особые дело строка интернирование.