Where is the documentation for the values() method of Enum?
JavaEnumsJava Problem Overview
I declare an enum as :
enum Sex {MALE,FEMALE};
And then, iterate enum as shown below :
for(Sex v : Sex.values()){
System.out.println(" values :"+ v);
}
I checked the Java API but can't find the values() method? I'm curious as to where this method comes from?
API link : https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html
Java Solutions
Solution 1 - Java
You can't see this method in javadoc because it's added by the compiler.
Documented in three places :
- Enum Types, from The Java Tutorials
> The compiler automatically adds some special methods when it creates > an enum. For example, they have a static values method that returns an > array containing all of the values of the enum in the order they are > declared. This method is commonly used in combination with the > for-each construct to iterate over the values of an enum type.
Enum.valueOf
class
(The special implicitvalues
method is mentioned in description ofvalueOf
method)
> All the constants of an enum type can be obtained by calling the implicit public static T[] values() method of that type.
The values
function simply list all values of the enumeration.
Solution 2 - Java
The method is implicitly defined (i.e. generated by the compiler).
From the JLS:
> In addition, if E
is the name of an enum
type, then that type has the following implicitly declared static
methods:
>
>
> /**
> * 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);
Solution 3 - Java
Run this
for (Method m : sex.class.getDeclaredMethods()) {
System.out.println(m);
}
you will see
public static test.Sex test.Sex.valueOf(java.lang.String)
public static test.Sex[] test.Sex.values()
These are all public methods that "sex" class has. They are not in the source code, javac.exe added them
Notes:
-
never use sex as a class name, it's difficult to read your code, we use Sex in Java
-
when facing a Java puzzle like this one, I recommend to use a bytecode decompiler tool (I use Andrey Loskutov's bytecode outline Eclispe plugin). This will show all what's inside a class