天天看點

Java裝逼神器三部曲之枚舉

原文位址

現在做什麼都講究個逼格,程式設計也不例外,如果在你的代碼中加了枚舉,那麼逼格就會高很多 o(∩_∩)o

在Java SE5之前,我們要使用枚舉類型時,通常會使用static final 定義一組int常量來辨別,代碼如下

public static final int MAN = ;
public static final int WOMAN = ;
           

相信很多小夥伴,在實際開發中也是那麼幹的,既然這樣已經能實作枚舉的功能,為什麼還要引入枚舉呢?我們接着往下看當我們需要是同這組“int枚舉”是代碼如下

public void showSex(int sex){
     switch(sex){
        case MAN:
           System.out.println("this is a boy");   
        break;    
        case WOMAN:
           System.out.println("this is a Girl");   
        break; 
      } 
}
           

看起來這些貌似也沒什麼問題,但是我們知道,一個項目基本都是基于團隊開發,或許隻有你自己知道int類型的1代表gril,0代表Boy。其他同僚看到這個函數根本不知道其中的含義,這樣的代碼很明顯閱讀性很差,進而會造成溝通成本很高。我們接着往下看,現在你為你的func寫了很nice的注釋,傻子都能看得懂(0 boy,1 gril)。但是項目組不可避免的總會出現那麼一兩個傻子,非要給你傳個3進來,而且這樣的錯誤編譯器不會報任何錯誤,運作時會造成什麼bug,這個隻有喬老爺知道了。是以這樣的代碼是極不安全的。使用枚舉就能很好的避免上面的問題,接下來我們就來理一理枚舉的用法。

枚舉用于存儲數量有限的一組固定的資料集。使用場景:上面說到的性别的表示,一年四級春夏秋冬的表示,一周七天的表示,顔色的表示等等。

枚舉的簡單用法

// 普通枚舉
 public enum ColorEnum {
        white, red, green, blue;
 }

    /**
     * 
     * 枚舉中有一個自帶的靜态方法values(),傳回enum執行個體的資料并且該數組中的元素順序和聲明時的順序一樣 
     * 枚舉也可以像普通的類一樣可以添加屬性和方法,可以為它添加靜态和非靜态的屬性或方法
     */
    public enum SeasonEnum {
        //注:枚舉寫在最前面,否則編譯出錯
        spring, summer, autumn, winter;

        private final static String position = "test";

        public static SeasonEnum getSeason() {
            if ("test".equals(position))
                return spring;
            else
                return winter;
        }
    }
     /**
     * 帶構造器的枚舉
     * 必須帶有一個參構造器和一個屬性跟方法,否則編譯出錯
     * 
     */
    public enum Mode {
        PULLDOWN("下拉"), PULLUP("上拉");
        private final String value;

        /**
         * 構造器預設也隻能是private, 進而保證構造函數隻能在内部使用
         * 
         */
        private Mode(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }
           

枚舉中還有一個ordinal()方法傳回一個int值,這是每個enum執行個體在聲明時的次序,從0開始。枚舉類還實作了Compareable接口,是以他具有compareTo()方法。同時還實作了Serializable接口,還自動為你提供了equals()和hashCode()方法。除了不能繼承一個枚舉類之外,我們基本上可以把枚舉類當成一個正常的Java類,可以往其中添加新的方法,包括抽象方法甚至main方法。

現在我們用枚舉來實作上面的那個性别函數

public enum EnumSex {
        MAN, WOMAN

    }

    public static void showSex(EnumSex EnumSex) {
        switch (EnumSex) {
        case MAN:
            System.out.println("this is a boy");
            break;
        case WOMAN:
            System.out.println("this is a girl");
            break;
        }
    }

    public static void main(String[] args) {
        showSex(EnumSex.MAN);
        // showSex(EnumSex.Renyao) 編譯報錯

    }
           

這樣既有很好的閱讀性又避免的安全性問題