2

Java Enum は特別な種類の ですdatatype。データ型という単語を見ると、メモリ内に事前定義されたメモリ サイズがあるか、高速アクセスのために要素がEnum任意に設定されているかdata structureなどの質問がほとんどありませんでした。Queue

Javaドキュメントによると

The enum declaration defines a class (called an enum type). The enum class body can include methods and other fields. The compiler automatically adds some special methods when it creates an enum.

コンパイラが enum に特別なメソッドを追加する理由。誰かがこれに光を当てることができますか?

ソース

前もって感謝します?

4

3 に答える 3

4

コンパイラが enum に特別なメソッドを追加する理由。

基本的に、列挙型の値を簡単に取得できるようにします。

追加のメソッドvalueOfとだけvaluesです。さらに、その型の値の制約されたセットに実際にアクセスできるように、型の値ごとに 1 つずつpublic static final fieldsがあります。

コンパイラがandメソッド (または少なくともメソッド) を追加しなかったと想像してみてください。「列挙型のすべての値」にどのようにアクセスしますか? 多くの場合、これは便利なことです。valueOfvaluesvalues

同様の機能が提供されるようになりましEnumSetたが、「すべての値」を取得するには、Class<>参照を提供する必要があり、面倒な場合があります。このvaluesメソッドは、呼び出すのがいくぶん簡単です (ただし、コストが高くなる可能性もあります)。

提供される内容の詳細については、JLS セクション 8.9を参照してください。

値の保存方法の問題に答えるために、値ごとに静的フィールドがあることが指定されていますが、実装の詳細として、Oracle Java コンパイラには配列を含む静的フィールドも含まれています。その配列は基本的にvaluesメソッドで複製されます。

これは自分で確認できます。

enum Foo {
    BAR, BAZ;
}

コンパイル:

javac Foo.java

逆コンパイル:

javap -private Foo

Compiled from "Foo.java"
final class Foo extends java.lang.Enum<Foo> {
  public static final Foo BAR;
  public static final Foo BAZ;
  private static final Foo[] $VALUES;
  public static Foo[] values();
  public static Foo valueOf(java.lang.String);
  private Foo();
  static {};
}

使用すると、基本的に次のjavap -cことがわかります。values()

public static Foo[] values() {
    return (Foo[]) $VALUES.clone();
}

静的初期化ブロックは、限定されたインスタンスのセットを作成し、フィールドを設定します。

于 2013-05-30T17:25:38.360 に答える