【问题标题】:Representation of enums枚举的表示
【发布时间】:2009-12-07 16:43:02
【问题描述】:

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

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

【问题讨论】:

    标签: enums implementation multiple-languages


    【解决方案1】:

    Java enums 利用很多 技巧来保持对象仍然是对象,但可以与== 一起使用。最初的 typesafe enum pattern(另请参阅Effective Java)可以提供一些见解,但 Enum.java source 将向您展示他们现在是如何做到的。

    【讨论】:

      【解决方案2】:

      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)
      

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          我认为枚举只是 const 整数。

          所以你有

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

          等等,编译器将命名空间“Test”添加到它们

          【讨论】:

            【解决方案5】:

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

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

            我通常更容易理解的是:

            public enum Test
                foo = 1
                bar = 2
            end enum
            

            试一试,把 1 和 2 换成字符串。这应该会引发编译器错误。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-30
              • 1970-01-01
              • 2020-11-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多