¿Por qué valueOf
tener dos parámetros?
en la documentación de Java para valueOf
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
parámetros:
enumType - la clase de objeto del tipo de enumeración de los cuales se devuelve una constante
Nombre - el nombre de la constante de retorno
Pero la mayoría de los ejemplos que he leído en línea dice:
enum WorkDays {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;
}
Prueba:
WorkDays day1 = WorkDays.valueOf("MONDAY");
System.out.println(day1); // >>> MONDAY
Parece que el método utilizado sólo un parámetro?
Usted sólo puede examinar el código de bytes para ver lo que sucede cuando una enum
se compila:
public enum TestEnum {A, B}
Y el código de bytes de valueOf
:
// access flags 0x9
public static valueOf(Ljava/lang/String;)LTestEnum;
L0
LINENUMBER 1 L0
LDC LTestEnum;.class
ALOAD 0
INVOKESTATIC java/lang/Enum.valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
CHECKCAST TestEnum
ARETURN
L1
LOCALVARIABLE name Ljava/lang/String; L0 L1 0
MAXSTACK = 2
MAXLOCALS = 1
No soy experto en el código de bytes, pero se puede ver que la línea:
INVOKESTATIC java/lang/Enum.valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
En invoca el hecho java.lang.Enum.valueOf
. Un equivalente de Java se vería así:
public static TestEnum myValueOf(String name) {
return Enum.valueOf(TestEnum.class, name);
}
Y el código de bytes confirma:
// access flags 0x9
public static myValueOf(Ljava/lang/String;)LTestEnum;
L0
LINENUMBER 6 L0
LDC LTestEnum;.class
ALOAD 0
INVOKESTATIC java/lang/Enum.valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
CHECKCAST TestEnum
ARETURN
L1
LOCALVARIABLE name Ljava/lang/String; L0 L1 0
MAXSTACK = 2
MAXLOCALS = 1
La comparación de estos dos fragmentos se puede ver la diferencia es ... sí, el nombre (y el número de línea):