web-dev-qa-db-ja.com

Enumのvalues()メソッドのドキュメントはどこにありますか?

列挙型を次のように宣言します。

enum Sex {MALE,FEMALE};

そして、次に示すようにenumを繰り返します。

for(Sex v : Sex.values()){
    System.out.println(" values :"+ v);
}

Java APIをチェックしましたが、values()メソッドが見つかりませんか?私はこの方法がどこから来るのか興味がありますか?

APIリンク: https://docs.Oracle.com/javase/8/docs/api/Java/lang/Enum.html

162
rai.skumar

このメソッドはコンパイラによって追加されるため、javadocには表示されません。

3か所に記載されています。

Enumを作成するとき、コンパイラは自動的にいくつかの特別なメソッドを追加します。たとえば、列挙型のすべての値を含む配列を宣言されている順序で返す静的値メソッドがあります。このメソッドは、列挙型の値を反復処理するために、for-eachコンストラクトと組み合わせて一般的に使用されます。

  • Enum.valueOf クラス
    (特別な暗黙のvaluesメソッドは、valueOfメソッドの説明に記載されています)

列挙型のすべての定数は、その型の暗黙のpublic static T [] values()メソッドを呼び出すことによって取得できます。

values関数は単に列挙のすべての値をリストします。

169
Denys Séguret

このメソッドは暗黙的に定義されています(つまり、コンパイラによって生成されます)。

JLS より:

さらに、Eenum型の名前である場合、その型は暗黙的に宣言されたstaticメソッドを持ちます。

/**
* Returns an array containing the constants of this enum 
* type, in the order they're declared.  This method may be
* used to iterate over the constants as follows:
*
*    for(E c : E.values())
*        System.out.println(c);
*
* @return an array containing the constants of this enum 
* type, in the order they're declared
*/
public static E[] values();

/**
* Returns the enum constant of this type with the specified
* name.
* The string must match exactly an identifier used to declare
* an enum constant in this type.  (Extraneous whitespace 
* characters are not permitted.)
* 
* @return the enum constant with the specified name
* @throws IllegalArgumentException if this enum type has no
* constant with the specified name
*/
public static E valueOf(String name);
29
NPE

これを実行

    for (Method m : sex.class.getDeclaredMethods()) {
        System.out.println(m);
    }

あなたは見るでしょう

public static test.Sex test.Sex.valueOf(Java.lang.String)
public static test.Sex[] test.Sex.values()

これらはすべて「性別」クラスが持つパブリックメソッドです。それらはソースコードにはありません、javac.exeはそれらを追加しました

ノート:

  1. クラス名としてsexを使わないでください。あなたのコードを読むのは難しいです。JavaではSexを使います。

  2. このようなJavaパズルに直面するとき、私はバイトコード逆コンパイラツールを使うことを勧めます(私はAndrey LoskutovのバイトコードアウトラインEclispeプラグインを使います)。これはクラス内にあるものすべてを表示します

12