Where is the documentation for the values() method of Enum?

JavaEnums

Java 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 :

> 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 implicit values method is mentioned in description of valueOf 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:

  1. never use sex as a class name, it's difficult to read your code, we use Sex in Java

  2. 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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionrai.skumarView Question on Stackoverflow
Solution 1 - JavaDenys SéguretView Answer on Stackoverflow
Solution 2 - JavaNPEView Answer on Stackoverflow
Solution 3 - JavaEvgeniy DorofeevView Answer on Stackoverflow