java基础之枚举类
很惭愧,之前给自己规定每周3~7篇博客,结果没做到,就不给自己找原因了,首先今天多补回来几篇。讲一下Java里的枚举类。
最近因项目需求在学c#,处理里面的枚举类时,突然想到Java里反射是如何处理枚举类这个问题,这也是本博客的重点之一。
上篇讲单例模式时讲到了枚举写法,该怎么理解枚举?先列下枚举的写法
public enum Season{ spring, summer, autumn, winter; }
应该怎么去理解这四个字段充当的角色?说白了,它们四个就是Season类本身创建出来的对象,等同于(只是结构上的大体等同)下面这样的写法
public class Season{ private Season(){} public static Season spring=new Season(); public static Season summer=new Season(); public static Season autumn=new Season(); public static Season winter=new Season(); }
以上就是个饿汉式的单例,把枚举类当做个葫芦,里面的成员是七个葫芦娃,每个都相对独立且唯一,外部无法通过葫芦类再去创造出一个八娃。
开发中有些人把枚举用来定义一些常量,我个人认为多此一举,直接public static final就OK了,毕竟枚举的后续处理并不方便。今天遇到一个这样的需求,根据字符串来返回对应的枚举对象,即给你“spring”,你来返回Season.spring。这就要用到反射了:
public static Map<String,Season> createSeasonMap(){
//获得season的Class对象 Class<?> clazz=Season.class;
//key为成员的名称,value为对应的成员本身 Map<String,Season> map=new HashMap<>();
//这个方法会返回该枚举的所有枚举对象 Season[] seasons=(Season[])clazz.getEnumConstants(); for(Season s:seasons){
//name()直接返回名称 map.put(s.name(), seasons); } return map; }
public static Season getSeason(String seasonName){ return createSeasonMap().get(seasonName); }
但是这是针对单个枚举类的方法,假设枚举类有十个,就要写十个这样的方法,重复度极高,目前我还没想到好的解决方案。欢迎您的想法。

浙公网安备 33010602011771号