Вы можете просто проверить байт-код, чтобы увидеть, что происходит, когда 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
Сравнивая эти два фрагмента, вы можете увидеть разницу ... да, имя (и номер строки):
