1. 程式人生 > >使用列舉封裝常量的好處附上一個列舉的小例子

使用列舉封裝常量的好處附上一個列舉的小例子

定義一個列舉類,類中存放了狀態編號,和該編號對應的資訊提示,列舉類中我們需要定義一個構造器,否則在定義SUCCESS、END、REPEAT_KILL、SYSTEM_ERROR等屬性的時候會報錯,同時我們之各state和msg變數get方法,不讓外部可以修改他們的引數和設定。

在這段程式碼中我們發現Enum列舉類沒有values()方法卻可以在列舉類中的stateOf方法使用:

java編譯器在對enum關鍵字進行處理時,實際上是將enum轉換成為了java.lang.Enum類的一個子類來完成,而這個子類中含有values()靜態方法。

列舉被設計成是單例模式,即列舉型別會由JVM在載入的時候,例項化列舉物件,你在列舉類中定義了多少個就會例項化多少個,JVM為了保證每一個列舉類元素的唯一例項,是不會允許外部進行new的,所以會把建構函式設計成private,防止使用者生成例項,破壞唯一性。

public enum StateEnum {

    SUCCESS(1,"秒殺成功"),
    END(2,"秒殺結束"),
    REPEAT_SECKILL(3,"重複秒殺"),
    SYSTEM_ERROR(4,"系統錯誤");

    private int state;

    private String msg;

    public int getState() {
        return state;
    }

    public String getMsg() {
        return msg;
    }

    private
StateEnum(int state, String msg) { this.state = state; this.msg = msg; } public static StateEnum stateOf(int index){ for (StateEnum enums : values()) { if(enums.getState()==index){ return enums; } } return null
; } }

定義一個實體類EnumExecution,裡面存放了,id、狀態編碼、編碼對應的資訊、還有一個person型別的引數。

public class EnumExecution {

    private long id;

    private int state;

    private String msg;

    private Person person;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }
//通過構造器傳入stateEnum列舉物件,這個物件中存放了state、msg等屬性,如果列舉是SUCCESS,則返回person
    public EnumExecution(long id, StateEnum states, Person person) {
        this.id = id;
        this.state = states.getState();
        this.msg = states.getMsg();
        this.person = person;
    }

    public EnumExecution(long id, StateEnum states) {
        this.id = id;
        this.state = states.getState();
        this.msg = states.getMsg();
    }

    @Override
    public String toString() {

        return "EnumExecution{"
                +"id:"+id
                +",state:"+state
                +",msg:"+msg
                +"}";
    }
}

測試類EnumTest:

public class EnumTest {

    public static void main(String[] args) {

        long id=1000;
        Person person=new Person("馬飛", 12);
        //如果不使用列舉型別,需要這樣去定義EnumExecution eex=new EnumExecution(id, 1,"秒殺成功", person);
        EnumExecution eex=new EnumExecution(id, StateEnum.SUCCESS, person);
        System.out.println(eex.getPerson().getName());
        System.out.println(eex.getMsg());
        System.out.println(eex.getState());
        System.out.println(eex.toString());

    }

}

其實在我們寫出來的邏輯程式碼裡面是不應該出現常量字串和常量數字之類的東西。

我們返回的state和msg引數資訊應該是輸出給前端的,但是我們不想在我們的return程式碼中硬編碼這兩個引數,所以我們應該考慮用列舉的方式將這些常量封裝起來。

在很久之後,忽然有些地方的值換了,只需要修改一處地方,整個專案都不用擔心會出問題,

但是,如果你沒有這麼幹,那麼,沒人知道你在邏輯程式碼裡面還有這樣的常量存在,就會造成很嚴重的後果。