为什么valueOf
有两个参数?
在Java documentation for valueOf
中
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
参数:
enumType-要从其返回常量的枚举类型的Class对象
name-要返回的常量的名称
但是我在网上阅读的大多数示例都说:
enum WorkDays {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;
}
测试:
WorkDays day1 = WorkDays.valueOf("MONDAY");
System.out.println(day1); // >>> MONDAY
该方法似乎仅使用一个参数?
答案 0 :(得分:3)
如先前的注释所述,您在文档中发现令人困惑的文本,并且由于您的个人资料表明您是新手程序员,所以
枚举是您将声明的所有枚举的超类。
在您的示例中,WorkDays可以看作是Enum类的特定情况。
为此父Enum类编写了valueOf()静态方法文档。
这意味着在您的情况下,它将被称为:
Enum.valueOf(WorkDays.class, "MONDAY")
。
现在,由于您创建了自己的枚举(即WorkDays),因此无需使用此静态父方法。您可以只使用自己创建的枚举公开的方法。
WorkDays.valueOf("Monday")
这是“隐式声明的”,意思是每个您自己创建的枚举都将存在。
答案 1 :(得分:2)
您共享的代码段使用第二段中引用的隐式声明的方法:
请注意,对于特定的枚举类型
T
,可以使用对该枚举隐式声明的public static T valueOf(String)
方法来代替从名称到对应的枚举常量的此方法。
第一段涉及通过Enum
类调用方法:
System.out.println(Enum.valueOf(WorkDays.class, "MONDAY"));
答案 2 :(得分:1)
您可以检查字节码以查看编译enum
时会发生什么:
public enum TestEnum {A, B}
还有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
我不是字节码专家,但是您可以看到以下行:
INVOKESTATIC java/lang/Enum.valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
实际上会调用java.lang.Enum.valueOf
。等效的Java看起来像这样:
public static TestEnum myValueOf(String name) {
return Enum.valueOf(TestEnum.class, name);
}
字节码确认了这一点:
// 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
比较这两个代码片段,您可以看到区别是...是,名称(和行号):