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

Javaは多くのトリックをenum利用して、オブジェクトのままですが、で動作します。元のタイプセーフな列挙型パターンEffective Javaも参照)はある程度の洞察を提供できますが、Enum.javaソースはそれらが現在どのように実行するかを正確に示します。==

于 2009-12-07T16:51:31.587 に答える
1

Javaの列挙型は、実際には算術型ではなく、コンパイラによって生成された特別なクラスです。列挙値は、の代わりに参照を比較するために、事前に生成されたグローバルインスタンスとして動作しますequals

.classファイルを逆アセンブルすることを確認できます。

  コード:
    0:getstatic#2; //フィールドYourEnum.BAR:LYourEnum;
    3:getstatic#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ほとんどの言語は列挙型を舞台裏に変換すると思いますが、それは確かに必須ではありません。

たとえば、上記の例では、コンパイラが2つの値が中間表現に変換されることなく等しいことを認識し、値を出力する可能性があり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;

など、コンパイラが名前空間'Test'を追加します。

于 2009-12-07T16:49:41.977 に答える