java中的列舉型別學習

喵先生的進階之路發表於2019-01-19

列舉,在java中看似很小的一部分,卻幫我們解決了很多大問題。

為什麼使用列舉

我們知道生活中的很多地方都可以使用列舉,但是很多人在實際程式設計的時候卻很少使用列舉型別,是因為列舉型別不好用嗎?我認為不是的,而是他們並不瞭解列舉。這也是我之前的狀態。

不使用列舉,對status(狀態)等一些數目有限的物件,我們通常會使用靜態常量的形式來表示,比如下面這樣:

public class Test() {
    private static final int CHECK_APPOINTMENT = 1;              // 預約中
    private static final int CHECK_PENDING_FEEDBACK = 2;         // 待反饋
    private static final int CHECK_FEEDBACK = 3;                 // 已反饋
    private static final int CHECK_ADMISSIBLE = 4;               // 已受理
    private static final int CHECK_ALREADY_CHECKED = 5;          // 已檢定
    private static final int CHECK_RESERVATION_FAILURE = 6;      //預約失敗
    ...
} 

這時候,就會這麼使用這些變數:

test.setStauts(Test.CHECK_APPOINTMENT);

好,這樣按規矩來,沒有任何問題,這樣寫的基礎是建立在小組中的每個人都對專案有足夠的瞭解,並且記憶力還不能太差了。但是就怕有些人不安規矩來:

test.setStatus(123);

完了,傻眼了。所以這就體現了列舉型別比靜態常量更加的安全。

列舉型別

我們這裡說的列舉型別是enum類,和classinterface地位相同。

下面介紹幾種簡單的列舉型別的用法。

1.一般用法

還是上面的例子,我們將它換成是列舉型別。

public enum ProcessStatusCode {
    CHECK_APPOINTMENT("預約中(待預約)", (short)1),
    CHECK_PENDING_FEEDBACK("待反饋", (short)2),
    CHECK_FEEDBACK("已反饋(待受理)", (short)3),
    CHECK_ADMISSIBLE("已受理(待檢定)", (short)4),
    CHECK_ALREADY_CHECKED("已檢定(檢定完成)", (short)5),
    CHECK_RESERVATION_FAILURE("預約失敗", (short)6);
    
    private Short code;     // 程式碼
    private String name;    // 名稱
    
    processStatusCode(String name, Short code) {
        this.name = name;
        this.code = code;
    }
}

首先,先定義列舉型別,需要說明的是,這裡必須在開頭就定義具體例項,然後才是定義變數,以及建構函式。

並且我們可以看到,在定義例項的時候,我們呼叫了建構函式,但是這是一種隱式的呼叫。

呼叫的時候很簡單:

ProcessStatusCode.CHECK_APPOINTMENT

2.switch中使用列舉

switch語句使用列舉型別是再合適不過的了,這可以大大的增加程式碼的易讀性。

enum Signal {  
    GREEN, YELLOW, RED  
}  
public class TrafficLight {  
    Signal color = Signal.RED;     // 初始化訊號燈顏色
     
    public void change() {  
        switch (color) {  
        case RED:  
            color = Signal.GREEN;  
            break;  
        case YELLOW:  
            color = Signal.RED;  
            break;  
        case GREEN:  
            color = Signal.YELLOW;  
            break;  
        }  
    }  
}

我們看到,在switch...case語句使用列舉型別的時候,case中的值直接使用列舉型別的具體例項,這點與上面的有一點不同。

3.列舉型別中定義函式

與類相同,我們也是可以在列舉中定義自己的函式的。

public enum Color {  
    RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);  
    // 成員變數  
    private String name;  
    private int index;
      
    // 構造方法  
    private Color(String name, int index) {  
        this.name = name;  
        this.index = index;  
    }  
     
    public void display() {
        System.out.println("這是" + this.name + "色");
    }
} 

總結

我們說,什麼是規範?規範就是一個團隊寫的程式碼像一個人寫的一樣。所以很多時候,雖然我們可以有很多的不同的方法去實現一個需求,但為什麼我們經常能夠聽到說“這種寫法更好”這樣的話,就是為了讓我們寫出的程式碼更加容易理解,更加易讀。

但是相反的,人們總是難免會有自己的想法,這樣就不利於程式碼的一致性。而我們又需要這種一直性,所以就 有了想列舉型別這樣的限制一些自己想法的東西出現了。

程式碼規範的出現,是因為有了合作的關係。現在的軟體已經越來越多的是由團隊進行編寫,而不是一個人的工作,所以我們應該更加重視程式碼規範。


參考:https://blog.csdn.net/qq_2709…

相關文章