说说Java中的枚举——反向查找、总结

 在 就是一个类一文中说到枚举也可以自定义构造函数,可以用属性来关联更多的数据。那如果我们有这样的一种需要该怎么办呢?——我们需要根据关联的数据来得到相应的枚举项,例如下面的这种情况:

Java代码

public final enum Status {

     WAITING(0),

     READY(1),

     SKIPPED(-1),

     COMPLETED(5);

     private int code;

     private Status(int code) {

          this.code = code;

     }

     public int getCode() { return code; }

}

    这里每种Status对应了一个code,WAITING对应了0,而COMPLETED对应了5。如果想通过0得到WAITING这个枚举项要怎么做?

    做法也很简单,使用一个静态的java.util.Map来把code和枚举项关联起来就可以了,就像这样:

Java代码

public final enum Status {

     WAITING(0),

     READY(1),

     SKIPPED(-1),

     COMPLETED(5);

     private static final Map lookup

          = new HashMap();

     static {

          for(Status s : EnumSet.allOf(Status.class)){

               lookup.put(s.getCode(), s);

          }

     }

     public static Status get(int code) {

          return lookup.get(code);

     }

     private int code;

     private Status(int code) {

          this.code = code;

     }

     public int getCode() { return code; }

}

    静态方法get(int)提供了需求中的反向查找能力,而静态块里使用EnumSet来把起映射做用的Map组装起来,Over!

总结:使用枚举,但不要滥用!

    学习任何新版语言的一个危险就是疯狂使用新的语法结构。如果这样做,那么您的代码就会突然之间有 80% 是泛型、标注和枚举。所以,应当只在适合使用枚举的地方才使用它。那么,枚举在什么地方适用呢?一条普遍规则是,任何使用常量的地方,例如目前用 switch 代码切换常量的地方。如果只有单独一个值(例如,鞋的最大尺寸,或者笼子中能装猴子的最大数目),则还是把这个任务留给常量吧。但是,如果定义了一组值,而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过。

---------------------------------------------------------------------------------------------------    

     系列文章:
     说说Java中的枚举——JDK1.4之前
     说说Java中的枚举——定义枚举
     说说Java中的枚举——简单使用
     说说Java中的枚举——EnumMap与EnumSet
     说说Java中的枚举——就是一个类
     说说Java中的枚举——模板方法
     说说Java中的枚举——反向查找、总结

你可能感兴趣的:(说说Java中的枚举——反向查找、总结)