Java enum 列舉還可以這麼用

2014-09-04    分類:JAVA開發、程式設計開發、首頁精華8人評論發表於2014-09-04

本文由碼農網 – 小峰原創,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

在大部分程式語言中,列舉型別都會是一種常用而又必不可少的資料型別,Java中當然也不會例外。然而,Java中的Enum列舉型別卻有著許多你意想不到的用法,下面讓我們一起來看看。

1、可以在enum中新增變數和方法

先來看一段程式碼示例:

public enum State {
        Normal("正常態", 1), Update("已更新", 2), Deleted("已刪除", 3), Fired("已遮蔽", 4);
        // 成員變數
        private String name;
        private int index;

        // 構造方法,注意:構造方法不能為public,因為enum並不可以被例項化
        private State(String name, int index) {
            this.name = name;
            this.index = index;
        }

        // 普通方法
        public static String getName(int index) {
            for (State c : State .values()) {
                if (c.getIndex() == index) {
                    return c.name;
                }
            }
            return null;
        }

        // get set 方法
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getIndex() {
            return index;
        }

        public void setIndex(int index) {
            this.index = index;
        }
    }

從上面的程式碼中我們可以看到,定義完列舉值,然後在其後面加上分號,接著就可以定義其他的變數、方法了。另外需要特別說明的是,enum中的構造方法不可以用public標識,這樣做是為了防止使用者例項化enum。

2、可以用來定義常量

先來回顧一下Java中如何定義常量吧,看下面一段程式碼:

public static final int normalState = 1;
private static final int updateState = 2;

下面我們還可以用enum列舉來代替上面的常量定義,程式碼如下:

public enum State {  
  Normal, Update, Deleted, Fired
}

在Java中用enum來定義常量在語法上沒有什麼優勢,但是enum列舉型別可以提供更多的操作功能。

3、在enum中實現介面

先來看下面一段程式碼:

public interface ICanReadState {
        void read();

        String getState();
}

    public enum State implements ICanReadState {
        Normal("正常態", 1), Update("已更新", 2), Deleted("已刪除", 3), Fired("已遮蔽", 4);

        private String name;
        private int index;

        private State(String name, int index) {
            this.name = name;
            this.index = index;
        }

        // 介面方法1

        @Override
        public String getState() {
            return this.name;
        }

        // 介面方法2
        @Override
        public void read() {
            System.out.println(this.index + ":" + this.name);
        }
    }

和一般的類中使用介面一樣,enum列舉中同樣可以繼承介面,並實現介面中的所有方法,這樣做的好處在於可以更方便地對列舉中的值進行排序、比較等操作,封裝性更好。

總結

說白了,enum列舉型別是一個不可以被繼承的final類,就以上面的State列舉為例,如果你檢視enum型別的位元組碼,其實是State型別的類靜態常量。

本文連結:http://www.codeceo.com/article/java-enum-usage.html
本文作者:碼農網 – 小峰
原創作品,轉載必須在正文中標註並保留原文連結和作者等資訊。]

相關文章