目录

引言

valueOf()用法

更新


引言

最近学习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()方法:

  1. 该方法为静态方法,调用者为枚举类,不是枚举值;
  2. 该方法形参只要一个String类型的值即可,并且该String值为枚举值对应的名称,即toString()方法返回的值(比如枚举类为SPRING,对应的名称就是"SPRING"),所以肯定是需要双引号的;
  3. 该方法有返回值,且返回值是一个枚举值(枚举类中定义的实例),比如我这里是季节枚举类,枚举值就是SPRING, SUMMER, FALL, WINTER;
  4. 该方法方法的作用就是返回【名称为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));

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐