2023年6月20日发(作者:)
javaenum传参_javaEnumvalueOf有两个参数?为什么valueOf有两个参数?Java⽂档中的Valueofpublic static > T valueOf?(ClassenumType, String name)Parameters:enumType - the Class object of the enum type from which to return a constantname - the name of the constant to return但我在⽹上看到的⼤多数例⼦都说:enum WorkDays {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;}测试:WorkDays day1 = f("MONDAY");n(day1); // >>> MONDAY该⽅法似乎只使⽤⼀个参数?请阅读您引⽤的⽂档。整个第⼆段。我真的觉得很困惑……但还是不明⽩……Java中理解Enums的可能副本简⽽⾔之,它说你可以做你所做的。据我所知,您使⽤的⽅法是由编译器⽣成的。两个参数⽅法在Enum类中声明,但也有隐式声明的⽅法values和valueOf8.9.3。枚举成员。你也可以叫f(,"MONDAY")。正如您在前⾯的注释中指出的,您发现⽂档中的⽂本令⼈困惑,并且由于您的概要⽂件表明您是⼀个新⼿程序员:枚举是要声明的所有枚举的超类。在您的⽰例中,⼯作⽇可以视为枚举类的特定情况。将为此⽗枚举类写⼊valueof()静态⽅法⽂档。也就是说,在您的案例中,它被称为:f(,"MONDAY")。现在,由于您创建了⾃⼰的枚举(即⼯作⽇),所以不需要使⽤这个静态⽗⽅法。您可以只使⽤由⾃⼰创建的枚举公开的⽅法。f("Monday")这是"隐式声明"的意思是它将存在于您⾃⼰创建的每个枚举中。您共享的代码段使⽤第⼆段中引⽤的隐式声明⽅法:Note that for a particular enum type T, the implicitly declared public static T valueOf(String) method on that enum may beused instead of this method to map from a name to the corresponding enum constant.第⼀段是通过Enum类调⽤⽅法:n(f(,"MONDAY"));您只需检查字节码,查看在编译Enum时会发⽣什么:public enum TestEnum {A, B}以及valueOf的字节码:// access flags 0x9public static valueOf(Ljava/lang/String;)LTestEnum;L0LINENUMBER 1 L0LDC LTestEnum;.classALOAD 0INVOKESTATIC java/lang/f (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;CHECKCAST TestEnumARETURNL1LOCALVARIABLE name Ljava/lang/String; L0 L1 0MAXSTACK = 2MAXLOCALS = 1我不是字节码专家,但您可以看到⾏:INVOKESTATIC java/lang/f (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;实际上调⽤f。Java等价物看起来是这样的:public static TestEnum myValueOf(String name) {return f(, name);}字节码证实了这⼀点:// access flags 0x9public static myValueOf(Ljava/lang/String;)LTestEnum;L0LINENUMBER 6 L0LDC LTestEnum;.classALOAD 0INVOKESTATIC java/lang/f (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;CHECKCAST TestEnumARETURNL1LOCALVARIABLE name Ljava/lang/String; L0 L1 0MAXSTACK = 2MAXLOCALS = 1⽐较这两个⽚段,你会发现不同之处是…是的,姓名(和⾏号):谢谢您!显⽰字节代码确实增加了另⼀层洞察⼒
2023年6月20日发(作者:)
javaenum传参_javaEnumvalueOf有两个参数?为什么valueOf有两个参数?Java⽂档中的Valueofpublic static > T valueOf?(ClassenumType, String name)Parameters:enumType - the Class object of the enum type from which to return a constantname - the name of the constant to return但我在⽹上看到的⼤多数例⼦都说:enum WorkDays {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;}测试:WorkDays day1 = f("MONDAY");n(day1); // >>> MONDAY该⽅法似乎只使⽤⼀个参数?请阅读您引⽤的⽂档。整个第⼆段。我真的觉得很困惑……但还是不明⽩……Java中理解Enums的可能副本简⽽⾔之,它说你可以做你所做的。据我所知,您使⽤的⽅法是由编译器⽣成的。两个参数⽅法在Enum类中声明,但也有隐式声明的⽅法values和valueOf8.9.3。枚举成员。你也可以叫f(,"MONDAY")。正如您在前⾯的注释中指出的,您发现⽂档中的⽂本令⼈困惑,并且由于您的概要⽂件表明您是⼀个新⼿程序员:枚举是要声明的所有枚举的超类。在您的⽰例中,⼯作⽇可以视为枚举类的特定情况。将为此⽗枚举类写⼊valueof()静态⽅法⽂档。也就是说,在您的案例中,它被称为:f(,"MONDAY")。现在,由于您创建了⾃⼰的枚举(即⼯作⽇),所以不需要使⽤这个静态⽗⽅法。您可以只使⽤由⾃⼰创建的枚举公开的⽅法。f("Monday")这是"隐式声明"的意思是它将存在于您⾃⼰创建的每个枚举中。您共享的代码段使⽤第⼆段中引⽤的隐式声明⽅法:Note that for a particular enum type T, the implicitly declared public static T valueOf(String) method on that enum may beused instead of this method to map from a name to the corresponding enum constant.第⼀段是通过Enum类调⽤⽅法:n(f(,"MONDAY"));您只需检查字节码,查看在编译Enum时会发⽣什么:public enum TestEnum {A, B}以及valueOf的字节码:// access flags 0x9public static valueOf(Ljava/lang/String;)LTestEnum;L0LINENUMBER 1 L0LDC LTestEnum;.classALOAD 0INVOKESTATIC java/lang/f (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;CHECKCAST TestEnumARETURNL1LOCALVARIABLE name Ljava/lang/String; L0 L1 0MAXSTACK = 2MAXLOCALS = 1我不是字节码专家,但您可以看到⾏:INVOKESTATIC java/lang/f (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;实际上调⽤f。Java等价物看起来是这样的:public static TestEnum myValueOf(String name) {return f(, name);}字节码证实了这⼀点:// access flags 0x9public static myValueOf(Ljava/lang/String;)LTestEnum;L0LINENUMBER 6 L0LDC LTestEnum;.classALOAD 0INVOKESTATIC java/lang/f (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;CHECKCAST TestEnumARETURNL1LOCALVARIABLE name Ljava/lang/String; L0 L1 0MAXSTACK = 2MAXLOCALS = 1⽐较这两个⽚段,你会发现不同之处是…是的,姓名(和⾏号):谢谢您!显⽰字节代码确实增加了另⼀层洞察⼒
发布评论