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

4

5 回答 5

2

Javaenum使用了很多技巧来仍然是对象,但可以使用==. 最初的类型安全枚举模式(另请参见Effective Java)可以提供一些见解,但Enum.java 源代码将向您展示他们现在是如何做到的。

于 2009-12-07T16:51:31.587 回答
1

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

您可以验证它反汇编一个 .class 文件:

  代码:
    0:获取静态#2;//字段 YourEnum.BAR:LYourEnum;
    3:获取静态#3;//字段 YourEnum.FOO:LYourEnum;
    6: if_acmpne 17    

它应该大致相当于以下 Java 代码:

enum YourEnum {
    FOO,
    BAR
}

// ...
if (YourEnum.BAR == YourEnum.FOO)

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

于 2009-12-07T17:08:25.043 回答
0

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

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

于 2009-12-07T16:46:52.543 回答
0

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

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

我通常更容易理解的是:

public enum Test
    foo = 1
    bar = 2
end enum

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

于 2009-12-07T16:47:05.587 回答
0

我认为枚举只是 const 整数。

所以你有了

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

依此类推,编译器将命名空间“测试”添加到它们

于 2009-12-07T16:49:41.977 回答