java Enum valueOf有两个参数?

时间:2019-03-20 16:01:39

标签: java enums

为什么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

该方法似乎仅使用一个参数?

3 个答案:

答案 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

比较这两个代码片段,您可以看到区别是...是,名称(和行号):

enter image description here