Представление перечислений - PullRequest
1 голос
/ 07 декабря 2009

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

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 07 декабря 2009

Java enum s использует lot уловок, чтобы оставаться объектами, но работать с ==. Исходный шаблон typesafe enum (см. Также Effective Java ) может дать некоторое представление, но источник Enum.java покажет вам, как они это делают сейчас.

1 голос
/ 07 декабря 2009

Тип enum в 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)

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

0 голосов
/ 07 декабря 2009

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

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

Что бы мне легче было понять, это:

public enum Test
    foo = 1
    bar = 2
end enum

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

0 голосов
/ 07 декабря 2009

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

так что у вас есть

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

и т. Д. С компилятором, добавляющим к ним пространство имен 'Test'

0 голосов
/ 07 декабря 2009

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

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

...