聶永的博客

          記錄工作/學習的點點滴滴。

          枚舉:不用那么單調,可以承擔一些業務意義

          人們大多順手定義了一個枚舉,僅僅是值的羅列,比如常見的一個,定義一個顏色枚舉:
          public enum Color {
          RED,GREEN,BLUE
          }
          人們很少去想這么一個問題:枚舉應該也可以承擔一些業務意義。比如在這個Color枚舉中,在某些情況下,我們需要得到顏色的名稱,并且具有一個數字版本的ID,若能提供一個隨機的顏色值就更好不過了。怎么辦 ?
          大部分人們會另建立一個類,提供幾個方法,對枚舉進行操作,以達到目的。但是這些方法本身應該是Color自身的一些動作,只是被割裂了。下面的代碼就能很好的完成以上要求:
          public enum Color {
          RED("red",1),GREEN("green",2),BLUE("blue",3);

          private String name;
          private int id;

          /**
          * 必須的,使用一個構造函數用以初始化枚舉常量
          * @param name
          * @param id
          */

          private Color(String name, int id){
          this.name = name;
          this.id = id;
          }

          public String getName(){
          return this.name;
          }

          public int getId(){
          return this.id;
          }
          }
          枚舉是一個class變體,類似于 RED("red",1) 可以看做是定了一個初始化Color的一個實例,其構造方法簽名具有兩個參數需要傳入。
          現在的調用方式:
          Color.RED.getName(), Color.RED.getId()

          嗯,缺少了一個隨機的顏色輸出方法,下面我們在Color里面添加如下代碼:
           private static Random random = new Random(47);

          /**
          * 隨機提供一個顏色 使用方法 : Color color = Color.random();
          *
          * @return Color
          */

          public static Color random() {
          Color[] colors = Color.values();
          return colors[random.nextInt(colors.length)];
          }

          要想提供一個隨機的顏色值,那就是靜態的,不是一個具體顏色的本身屬性。枚舉都是具有values屬性,返回一個數組。使用方法為 
          Color color = Color.random();
          //一些屬性的獲取等操作
          有時,我們需要傳入一個顏色值字符串獲得對應的枚舉值:
           /**
          * 構造一個Map,并初始化,便于插敘
          */

          private static Map<String, Color> clorNameMap = new HashMap<String, Color>(
          Color.values().length);
          static {
          for (Color color : Color.values()) {
          clorNameMap.put(color.getName(), color);
          }
          }

          /**
          * 通過顏色名稱獲取顏色枚舉實例
          * @return
          */

          public static Color getByName(String colorName){
          return clorNameMap.get(colorName);
          }
          構造了一個私有的Map對象,提升查詢時的速度。使用方法:
          Color color = Color.getByName(“red”);
          若通過ID進行查詢也可以按此方法,這里不再提供。下面為完整的代碼:




          import java.util.HashMap;
          import java.util.Map;
          import java.util.Random;

          /**
          * 枚舉可以承擔一些業務意義
          *
          * @author yongboy@gmail.com
          * @date 2010-10-21
          */

          public enum Color {
          RED("red", 1), GREEN("green", 2), BLUE("blue", 3);

          private String name;
          private int id;

          /**
          * 必須的,使用一個構造函數用以初始化枚舉常量
          *
          * @param name
          * @param id
          */

          private Color(String name, int id) {
          this.name = name;
          this.id = id;
          }

          public String getName() {
          return this.name;
          }

          public int getId() {
          return this.id;
          }

          private static Random random = new Random(47);

          /**
          * 隨機提供一個顏色 使用方法 : Color color = Color.random();
          *
          * @return Color
          */

          public static Color random() {
          Color[] colors = Color.values();
          return colors[random.nextInt(colors.length)];
          }

          /**
          * 構造一個Map,并初始化,便于插敘
          */

          private static Map<String, Color> clorNameMap = new HashMap<String, Color>(
          Color.values().length);
          static {
          for (Color color : Color.values()) {
          clorNameMap.put(color.getName(), color);
          }
          }

          /**
          * 通過顏色名稱獲取顏色枚舉實例
          *
          * @return
          */

          public static Color getByName(String colorName) {
          return clorNameMap.get(colorName);
          }

          public String toString() {
          return name + "(" + id + ")";
          }
          }
          下面是UML示意圖:
          enum

          這里不是教大家獲取枚舉的一些編程技巧,那不是本意。只是想讓一些看到本文的人注意一下:枚舉可以承擔一些業務意義。

          posted on 2010-10-22 11:52 nieyong 閱讀(722) 評論(0)  編輯  收藏 所屬分類: Java

          公告

          所有文章皆為原創,若轉載請標明出處,謝謝~

          新浪微博,歡迎關注:

          導航

          <2010年10月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統計

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個人收藏

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 大同市| 红河县| 陕西省| 阿拉尔市| 富宁县| 博湖县| 年辖:市辖区| 武隆县| 邻水| 大同市| 苍溪县| 青河县| 北宁市| 教育| 读书| 逊克县| 阜新市| 绍兴县| 安丘市| 大余县| 镇远县| 洛南县| 工布江达县| 神池县| 莱阳市| 民县| 安吉县| 曲阜市| 泰来县| 安阳县| 扎兰屯市| 肇东市| 三亚市| 彭泽县| 汾西县| 渑池县| 托里县| 平遥县| 博白县| 巩留县| 太仆寺旗|