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);
}

  但是这是针对单个枚举类的方法,假设枚举类有十个,就要写十个这样的方法,重复度极高,目前我还没想到好的解决方案。欢迎您的想法。

posted @ 2016-12-09 21:10  平凡之路-不甘平凡  阅读(74)  评论(0)    收藏  举报