列挙型を次のように宣言します。
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
このメソッドはコンパイラによって追加されるため、javadocには表示されません。
3か所に記載されています。
Enumを作成するとき、コンパイラは自動的にいくつかの特別なメソッドを追加します。たとえば、列挙型のすべての値を含む配列を宣言されている順序で返す静的値メソッドがあります。このメソッドは、列挙型の値を反復処理するために、for-eachコンストラクトと組み合わせて一般的に使用されます。
Enum.valueOf
クラスvalues
メソッドは、valueOf
メソッドの説明に記載されています)列挙型のすべての定数は、その型の暗黙のpublic static T [] values()メソッドを呼び出すことによって取得できます。
values
関数は単に列挙のすべての値をリストします。
このメソッドは暗黙的に定義されています(つまり、コンパイラによって生成されます)。
JLS より:
さらに、
E
がenum
型の名前である場合、その型は暗黙的に宣言された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);
これを実行
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はそれらを追加しました
ノート:
クラス名としてsexを使わないでください。あなたのコードを読むのは難しいです。JavaではSexを使います。
このようなJavaパズルに直面するとき、私はバイトコード逆コンパイラツールを使うことを勧めます(私はAndrey LoskutovのバイトコードアウトラインEclispeプラグインを使います)。これはクラス内にあるものすべてを表示します