Java枚举类——valueOf()的用法
目录引言valueOf()用法更新引言最近学习Java,到了枚举类部分,书上列举了几个方法:int compareTo()String name()int ordinal()String toString()valueOf()前面几个都没问题,照着书看就会用了,唯独最后一个让我看得有些懵,因为书上是这么把这个方法呈现在我眼前的:public stat...
文章共1,148字 · 阅读需要大约4分钟
一键AI生成摘要,助你高效阅读
问答
·
目录
引言
最近学习Java,到了枚举类部分,书上列举了几个方法:
- int compareTo()
- String name()
- int ordinal()
- String toString()
- valueOf()
前面几个都没问题,照着书看就会用了,唯独最后一个让我看得有些懵,因为书上是这么把这个方法呈现在我眼前的:
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
说实话第一眼看我没看太明白,前面几个明明就是返回值,形参列表就完了,这个咋这么一串!然后我就凭着粗糙的理解瞎用:
- 第一版
SeasonEnum.valueOf(SeasonEnum,SPRING);//SeasonEnum为定义的枚举类,SPRING为其中实例
报错,然后瞎试了试其他的变换,依旧报错,所以就上网查一查。看到如下代码x
Mobile ret;
ret = Mobile.valueOf("Samsung");
我当时看到心里有些固执:我定义的枚举类实例是SPRING,不是一个字符串"SPRING"!所以觉得别人博客上写错了。但还是随手加了双引号再试试自己的代码,依旧编译不通过。
当时一连看了好几篇博客,感觉就没有一个好好讲明白了这个方法,心里有些纳闷儿:咋一个方法看了几篇博客都没人讲明白呢?!其实后来想想原因在于我自己看别人的东西没有看得很仔细,代码x其实把要素都包含了。
valueOf()用法
下面就单独讲一下valueOf()方法:
- 该方法为静态方法,调用者为枚举类,不是枚举值;
- 该方法形参只要一个String类型的值即可,并且该String值为枚举值对应的名称,即toString()方法返回的值(比如枚举类为SPRING,对应的名称就是"SPRING"),所以肯定是需要双引号的;
- 该方法有返回值,且返回值是一个枚举值(枚举类中定义的实例),比如我这里是季节枚举类,枚举值就是SPRING, SUMMER, FALL, WINTER;
- 该方法方法的作用就是返回【名称为String name的】【枚举类T中的】枚举值;
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)//官方给的这个说明中的形参列表看上去好像是两个:一个Class<T> enumType,另一个String name。但实际上Class<T> enumType这个是不需要的(或者说这是官方说明文档的语法,并不是表示形参)。
所以我的第一版代码修改后应该是:
SeasonEnum a;//定义枚举类型变量a,用于接收valueOf()方法的返回值
a=SeasonEnum.valueOf("SPRING");//valueOf()方法调用者为枚举类,此处为SeasonEnum;形参只需一个——枚举值名称,注意是String类型,要加双引号,此处为"SPRING"
System.out.println(a.compareTo(SeasonEnum.SPRING));//通过a调用实例方法compareTo(),输出0,表明a为枚举值SPRING
可能比较啰嗦,因为掺杂了自己的感受,但valueOf()的用法应该还是讲明白了的。其实本来也就没啥,主要是一开始被那一串官方给的说明给搞懵了。
更新
没想到刚看完上一小节就发现了一个valueOf()的用法,证明我上面说的比较局限,直接贴代码:
SeasonEnum a;
SeasonEnum b;
a=SeasonEnum.valueOf(SeasonEnum.class,"SPRING");//单独用SeasonEnum做实参报错,但是加上后缀.class就没问题了
System.out.println(a.compareTo(SeasonEnum.SPRING));
b=Enum.valueOf(SeasonEnum.class,"SUMMER");//上面调用主体是SeasonEnum,这里是Enum。需要说明一下:所有枚举类都继承了java.lang.Enum类。
System.out.println(b.compareTo(SeasonEnum.SUMMER));
更多推荐
已为社区贡献3条内容
所有评论(0)