Почему valueOf имеет два параметра?
в Документация Java для valueOf
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)Parameters:
enumType - the Class object of the enum type from which to return a constant
name - the name of the constant to return
Но в большинстве примеров, которые я читал в Интернете, говорится:
enum WorkDays {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;
}
Тестовое задание:
WorkDays day1 = WorkDays.valueOf("MONDAY");
System.out.println(day1); // >>> MONDAY
Кажется, что метод использовал только один параметр?
Весь второй абзац.
Я на самом деле нахожу это запутанным... и до сих пор не понимаю...
Возможный дубликат Понимание перечислений в Java
В двух словах это говорит о том, что вы можете делать то, что вы делали. Насколько я понимаю, метод, который вы используете, создается компилятором.
метод с двумя аргументами объявлен в классе Enum, но есть и неявно объявленные методы values и valueOf: 8.9.3. Члены перечисления. Можно было еще вызвать Enum.valueOf(WorkDays.class, "MONDAY")




Фрагмент, которым вы поделились, использует неявно объявленный метод, указанный во втором абзаце:
Note that for a particular enum type
T, the implicitly declaredpublic static T valueOf(String)method on that enum may be used instead of this method to map from a name to the corresponding enum constant.
Первый абзац относится к вызову метода через класс Enum:
System.out.println(Enum.valueOf(WorkDays.class, "MONDAY"));
Вы можете просто изучить байт-код, чтобы увидеть, что происходит, когда компилируется 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
Сравнивая эти два фрагмента, вы можете увидеть разницу... да, имя (и номер строки):
Спасибо! Отображение байт-кода добавляет еще один уровень понимания
Как вы указали в предыдущих комментариях, вы находите текст в документации запутанным, и, поскольку в вашем профиле указано, что вы начинающий программист:
Enum — это суперкласс всех перечислений, которые вы объявите.
В вашем примере WorkDays можно рассматривать как частный случай класса Enum.
Документация статического метода valueOf() написана для этого родительского класса Enum.
Это означает, что в вашем случае это будет называться так:
Enum.valueOf(WorkDays.class, "MONDAY").
Теперь, поскольку вы создали свой собственный Enum (т. е. WorkDays), вам не нужно использовать этот статический родительский метод. Вы можете просто использовать метод, который выставлен вашим самостоятельно созданным перечислением.
WorkDays.valueOf("Monday")
Это «неявно объявлено», что означает, что оно будет там для каждого из ваших самостоятельно созданных перечислений.
Пожалуйста, прочитайте документацию, на которую вы ссылались.