java 枚舉——java(android)中枚舉的運用和使用場景

原文地址

(有人說枚舉比靜態賦值消耗的資源大些,不知道是不是)

如果作爲一個Java開發工程師還不瞭解或者還不能很好的運用枚舉這個新特性的話,那你就得好好看一看枚舉了。因爲枚舉在java5以後是個很好用的新特性。

基本特性:

1,enum關鍵字
枚舉enum是同class,interface同一級別的特性。
我們可以把enum看作一個抽象類,但是它又有它的不同之處,enum不能被繼承。

這一點其實在Android源碼中就得到了證實:

Public abstract class Enum<E extends Enum<E>> implements Serializable,Comparable <E>    
{   
   ...  
} 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

從源碼中可以看出Enum相當於一個抽象類。所以,enum可以看成一個抽象類並且和class、interface同級。

2,枚舉的定義
如何在Enum中定義枚舉常量呢?
1,枚舉常量沒有任何修飾符
2,每個常量以“,”分隔,以“;”結束枚舉常量的描述。
3,枚舉常量必須定義在所有方法或者構造器之前。

規矩我們已經知道了,接下來就看看如何在代碼裏定義枚舉常量了:

//枚舉常量的定義可以在最後一個元素加,再加;結束。常量區分大小寫
public enum OrdinaryEnums {
        red,
        RED,
        green,
        yellow,
        blue,;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3,使用枚舉的目的
當我們需要限制一系列變量的時候,通常想到數組或者集合;其實很多時候我們需要限定變量需要做的事情很多,或者說如果被限制的變量可以做其他事情的話就更好了,而不是單純的一個變量(String,int,double)。

那麼,枚舉的作用不僅僅可以讓你使用限制在一個enum中的變量,並且這些變量的靈活性和拓展性很好。
舉例說明:
如果我們需要使用一些狀態,比如一個星期的狀態。
我們可以用數組:

 String[] week=new String[7];
        week[0]="星期天";
        week[1]="星期一";
        week[2]="星期二";
        week[3]="星期三";
        week[4]="星期四";
        week[5]="星期五";
        week[6]="星期六";
        String weekday=week[0];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

或者集合,這些表示大家都很熟悉。
那麼看看用枚舉如何來寫:

 public enum WeekEnums {
        //注:枚舉寫在最前面,否則編譯出錯
        Sunday,
        Monday,
        Tuesday,
        Wednesday,
        Thursday,
        Friday,
        Saturday,;

        private static String getWeek(WeekEnums weekEnums) {
            String week = null;
            switch (weekEnums) {
                case Sunday://星期天
                    week = "星期天";
                    break;
                case Monday://星期一
                    week = "星期一";
                    break;
                case Tuesday:// 星期二
                    week = "星期二";
                    break;
                case Wednesday://星期三
                    week = "星期三";
                    break;
                case Thursday:// 星期四
                    week = "星期四";
                    break;
                case Friday://星期五
                    week = "星期五";
                    break;
                case Saturday://  星期六
                    week = "星期六";
                    break;
            }
            return week;
        }
    }
//獲取方式:
String weekday = WeekEnums.getWeek(WeekEnums.Friday);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

可能,有人會說,這樣寫可是很麻煩。的確比數組或者集合麻煩了,但是它的拓展性是非常好的,因爲往往我們需要的不僅僅是一個字符串,不僅僅是調用數字得到一個以供顯示的星期,而是更多的邏輯處理。

我們來重寫一下枚舉中getWeek方法:

private static String getWeek(WeekEnums weekEnums) {
            String week = null;
            String behavior = null;
            switch (weekEnums) {
                case Sunday://星期天
                    week = "星期天";
                    behavior = "星期天我要去打球";//模仿一個邏輯處理
                    break;
                case Monday://星期一
                    week = "星期一";
                    behavior = "我要去上課";//模仿一個邏輯處理
                    break;
                case Tuesday:// 星期二
                    week = "星期二";
                    behavior = "我要去奶奶家";//模仿一個邏輯處理
                    break;
                case Wednesday://星期三
                    week = "星期三";
                    behavior = "我要去做義工";//模仿一個邏輯處理
                    break;
                case Thursday:// 星期四
                    week = "星期四";
                    behavior = "我要去做義工";//模仿一個邏輯處理
                    break;
                case Friday://星期五
                    week = "星期五";
                    behavior = "我要去做義工";//模仿一個邏輯處理
                    break;
                case Saturday://  星期六
                    behavior = "我要去做義工";//模仿一個邏輯處理
                    week = "星期六";
                    break;
            }
            return week;
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

這時候,枚舉的有點久體現出來了,不僅僅可以獲得狀態,還可以在枚舉中處理邏輯。
這是數組或者集合無法做到了,而且枚舉完成的邏輯不僅僅這些,還能完成更多更復雜的邏輯處理。

4,使用枚舉

/**
 * 普通的枚舉
 * 普通枚舉在作用在於控制變量的範圍,作用和數組、集合一樣
 */
public class OrdinaryEnum {
    public enum OrdinaryEnums {
        red,
        green,
        yellow,
        blue,;
    }

    private void test(OrdinaryEnums ordinaryEnums) {
        switch (ordinaryEnums) {
            case red://表示紅色的枚舉
                break;
            case green://表示綠色的枚舉
                break;
            case yellow://表示黃色的枚舉
                break;
            case blue://表示藍色的枚舉
                break;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
**
 * 帶屬性的枚舉
 * 通過枚舉可以獲得一個相應的結果
 */
public class AattributeEnum {

    public enum AattributeEnums {
        //注:枚舉寫在最前面,否則編譯出錯
        red,
        RED,
        green,
        yellow,
        blue,;
        private static int color = Color.WHITE;

        private static int getColor(AattributeEnums aattributeEnums) {
            switch (aattributeEnums) {
                case red://表示紅色的枚舉
                    color = Color.RED;
                    break;
                case green://表示綠色的枚舉
                    color = Color.GREEN;
                    break;
                case yellow://表示黃色的枚舉
                    color = Color.YELLOW;
                    break;
                case blue://表示藍色的枚舉
                    color = Color.BLUE;
                    break;
                case RED://表示藍色的枚舉
                    color = Color.RED;
                    break;
            }
            return color;
        }
    }

    private void test() {
        int color = AattributeEnums.getColor(AattributeEnums.red);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
/**
 * 帶構造器的枚舉
 * 枚舉的構造器類似於類的構造方法
 * 不同的是,枚舉的構造器只提供給內部的枚舉變量使用
 * 外界調用具體的枚舉變量就相當於執行了構造器中的邏輯
 */
public class ConstructorEnum {

    public enum ConstructorEnums {
        red(Color.RED),
        green(Color.RED),
        yellow(Color.RED),
        blue(Color.BLUE),;
        private int color;

        ConstructorEnums(int color) {
            this.color = color;
        }

        private int getColor() {
            return color;
        }
    }

    private void test() {
        int color = ConstructorEnums.red.getColor();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
/**
 * 帶抽象方法的枚舉
 * 在枚舉中定義抽象方法,那麼這個抽象方法所有的枚舉變量都要去實現;不管有多少個抽象方法都一樣
 * 外界調用相對應的枚舉變量中的抽象方法就可以讓枚舉處理自己實現的這個抽象方法的具體實現邏輯
 */
public class AbstractEnum {

    public enum AbstractEnums {
        red {
            public int getColor() {
                return Color.RED;
            }

            public String getWeek() {
                return "星期一";
            }
        },
        green {
            public int getColor() {
                return Color.GREEN;
            }

            public String getWeek() {
                return "星期一";
            }
        },
        yellow {
            public int getColor() {
                return Color.YELLOW;
            }

            public String getWeek() {
                return "星期一";
            }
        },
        blue {
            public int getColor() {
                return Color.BLUE;
            }

            public String getWeek() {
                return "星期一";
            }
        },;

        public abstract int getColor();

        public abstract String getWeek();
    }

    private void test() {
        int color = AbstractEnums.red.getColor();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

我們可以通過這四種方式根據不同的情景來使用相應的枚舉處理一些複雜的邏輯。

總結:
當我們在需要控制一個方法傳入的參數的時候,並且這些參數可以自己處理一些事情的時候我們就可以選擇枚舉來實現。

例如:時間選擇格式,我們可以用枚舉來規定格式,然後外界只能調用枚舉中的格式,然後枚舉再去將規定的格式傳給時間用於格式化。
所有的邏輯處理交給枚舉來完成,我們只需要調用相應的枚舉類型就能得到想要的時間格式的時間。
還有很多地方都體現出枚舉的好處,例如:網絡請求的接口定義;一些輯返回參數的定義;

只要是需要控制變量的數量或者範圍,並且拿到變量後還需要處理一些邏輯的場景都可以用枚舉來完成。

空說也沒作用。只有實戰中真正良好的用到了,才能體會到它的魅力。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章