Java Enum valueOf имеет два параметра?

Почему 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

Кажется, что метод использовал только один параметр?

Пожалуйста, прочитайте документацию, на которую вы ссылались.

user2956272 20.03.2019 17:03

Весь второй абзац.

user2956272 20.03.2019 17:06

Я на самом деле нахожу это запутанным... и до сих пор не понимаю...

jxie0755 20.03.2019 17:07

Возможный дубликат Понимание перечислений в Java

Lino 20.03.2019 17:08

В двух словах это говорит о том, что вы можете делать то, что вы делали. Насколько я понимаю, метод, который вы используете, создается компилятором.

user2956272 20.03.2019 17:12

метод с двумя аргументами объявлен в классе Enum, но есть и неявно объявленные методы values и valueOf: 8.9.3. Члены перечисления. Можно было еще вызвать Enum.valueOf(WorkDays.class, "MONDAY")

user85421 20.03.2019 17:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
6
1 931
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Фрагмент, которым вы поделились, использует неявно объявленный метод, указанный во втором абзаце:

Note that for a particular enum type T, the implicitly declared public 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

Сравнивая эти два фрагмента, вы можете увидеть разницу... да, имя (и номер строки):

Спасибо! Отображение байт-кода добавляет еще один уровень понимания

jxie0755 20.03.2019 17:53

Как вы указали в предыдущих комментариях, вы находите текст в документации запутанным, и, поскольку в вашем профиле указано, что вы начинающий программист:

Enum — это суперкласс всех перечислений, которые вы объявите. В вашем примере WorkDays можно рассматривать как частный случай класса Enum. Документация статического метода valueOf() написана для этого родительского класса Enum. Это означает, что в вашем случае это будет называться так: Enum.valueOf(WorkDays.class, "MONDAY").

Теперь, поскольку вы создали свой собственный Enum (т. е. WorkDays), вам не нужно использовать этот статический родительский метод. Вы можете просто использовать метод, который выставлен вашим самостоятельно созданным перечислением.

WorkDays.valueOf("Monday")

Это «неявно объявлено», что означает, что оно будет там для каждого из ваших самостоятельно созданных перечислений.

Другие вопросы по теме