1. 程式人生 > >java 列舉——java(android)中列舉的運用和使用場景

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>    
{
... }

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

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

規矩我們已經知道了,接下來就看看如何在程式碼裡定義列舉常量了:

//列舉常量的定義可以在最後一個元素加,再加;結束。常量區分大小寫
public enum OrdinaryEnums {
        red,
        RED,
        green,
        yellow,
        blue,;
    }

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];

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

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

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

我們來重寫一下列舉中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;
        }

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

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;
        }
    }
}
**
 * 帶屬性的列舉
 * 通過列舉可以獲得一個相應的結果
 */
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);
    }
}
/**
 * 帶構造器的列舉
 * 列舉的構造器類似於類的構造方法
 * 不同的是,列舉的構造器只提供給內部的列舉變數使用
 * 外界呼叫具體的列舉變數就相當於執行了構造器中的邏輯
 */
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();
    }
}
/**
 * 帶抽象方法的列舉
 * 在列舉中定義抽象方法,那麼這個抽象方法所有的列舉變數都要去實現;不管有多少個抽象方法都一樣
 * 外界呼叫相對應的列舉變數中的抽象方法就可以讓列舉處理自己實現的這個抽象方法的具體實現邏輯
 */
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();
    }
}

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

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

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

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

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