java Enum valueOf имеет два параметра? - PullRequest
3 голосов
/ 20 марта 2019

Почему valueOf имеет два параметра?

in Java документация для valueOf

public static <T extends Enum<T>> T valueOf​(Class<T> enumType, String name)

Параметры:

enumType - объект Class типа enum, из которого возвращается константа

name - имя возвращаемой константы

Но большинство примеров, которые я читаю онлайн, гласят:

enum WorkDays {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;
}

Тест:

WorkDays day1 = WorkDays.valueOf("MONDAY");
System.out.println(day1); // >>>  MONDAY

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

Ответы [ 3 ]

3 голосов
/ 20 марта 2019

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

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

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

WorkDays.valueOf("Monday")

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

2 голосов
/ 20 марта 2019

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

Обратите внимание, что для определенного типа перечисления T неявно объявленный метод public static T valueOf(String) для этого перечисления может бытьвместо этого метода используется для сопоставления имени с соответствующей константой перечисления.

Первый абзац относится к вызову метода через класс Enum:

System.out.println(Enum.valueOf(WorkDays.class, "MONDAY"));
1 голос
/ 20 марта 2019

Вы можете просто проверить байт-код, чтобы увидеть, что происходит, когда 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...