首頁 > Java > Java基礎 > 主體

淺談java枚舉類別(附程式碼)

發布: 2019-11-25 16:57:02
轉載
2066 人瀏覽過

淺談java枚舉類別(附程式碼)

java列舉類別介紹:(java學習影片推薦:java影片教學

一、什麼情況下使用枚舉類別?

有的時候一個類別的物件是有限且固定的,這種情況下我們使用枚舉類別就比較方便。

二、為什麼不用靜態常數來取代枚舉類別呢?

public static final int SEASON_SPRING = 1;    
public static final int SEASON_SUMMER = 2;    
public static final int SEASON_FALL = 3;    
public static final int SEASON_WINTER = 4;
登入後複製

枚舉類別更直觀,類型安全。使用常數會有以下幾個缺陷:

1. 類型不安全。若一個方法中要求傳入季節這個參數,用常數的話,形參就是int型,開發者傳入任意型別的int型別值就行,但是如果是列舉型別的話,就只能傳入枚舉類別中包含的對象。

2. 沒有命名空間。開發者要在命名的時候以SEASON_開頭,這樣另外一個開發者再看這段程式碼的時候,才知道這四個常數分別代表季節。

三、列舉類別入門

先看一個簡單的枚舉類別。

package enumcase;public enum SeasonEnum {
    SPRING,SUMMER,FALL,WINTER;
}
登入後複製

enum和class、interface的地位一樣使用enum定義的枚舉類別預設繼承了java.lang.Enum,而不是繼承Object類別。枚舉類別可以實作一個或多個介面。所有枚舉類別的實例都必須放在第一行展示,不需要使用new 關鍵字,不需要明確呼叫建構器。自動加入public static final修飾。使用enum定義、非抽象的枚舉類別預設使用final修飾,不可以被繼承。枚舉類別的建構器只能是私有的。

四、枚舉類別介紹

枚舉類別內也可以定義屬性和方法,可是是靜態的和非靜態的。

package enumcase;public enum SeasonEnum {
    SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");    
    private final String name;    
    private SeasonEnum(String name)
    {        this.name = name;
    }    public String getName() {        return name;
    }
}
登入後複製

實際上在第一行寫枚舉類別實例的時候,預設是呼叫了建構器的,所以此處需要傳入參數,因為沒有明確申明無參構造器,只能調用有參數的構造器。

建構器需定義成私有的,這樣就不能在別處申明此類的物件了。枚舉類別通常應該設計成不可變類,它的Field不應該被改變,這樣會更安全,而且程式碼更加簡潔。所以我們將Field用private final修飾。

五、枚舉類別實作介面

枚舉類別可以實作一個或多個介面。與普通類別一樣,實作介面的時候需要實作介面中定義的所有方法,若沒有完全實現,那這個枚舉類別就是抽象的,只是不需要明確加上abstract修飾,系統化會預設加上。

package enumcase;

public enum Operation {
    PLUS{

        @Override
        public double eval(double x, double y) {
            return x + y;
        }
        
    },
    MINUS{

        @Override
        public double eval(double x, double y) {
            return x - y;
        }
        
    },
    TIMES{

        @Override
        public double eval(double x, double y) {
            return x * y;
        }
        
    },
    DIVIDE{

        @Override
        public double eval(double x, double y) {
            return x / y;
        }
        
    };
    
    /**
     * 抽象方法,由不同的枚举值提供不同的实现。
     * @param x
     * @param y
     * @return
     */
    public abstract double eval(double x, double y);
    
    public static void main(String[] args) {
        System.out.println(Operation.PLUS.eval(10, 2));
        System.out.println(Operation.MINUS.eval(10, 2));
        System.out.println(Operation.TIMES.eval(10, 2));
        System.out.println(Operation.DIVIDE.eval(10, 2));
    }
}
登入後複製

Operatio類別實際上是抽象的,不可以創建枚舉值,所以此處在申明枚舉值的時候,都實現了抽象方法,這其實是匿名內部類別的實現,花括號部分是一個類體。我們可以看下編譯以後的檔案。

共生成了五個class文件,這樣就證明了PLUS,MINUS,TIMES,DIVIDE是Operation的匿名內部類別的實例。

淺談java枚舉類別(附程式碼)

六、switch語句裡的運算式可以是列舉值

Java5新增了enum關鍵字,同時擴充了switch。

package enumcase;

public class SeasonTest {
    public void judge(SeasonEnum s)
    {
        switch(s)
        {
        case SPRING:
            System.out.println("春天适合踏青。");
            break;
        case SUMMER:
            System.out.println("夏天要去游泳啦。");
            break;
        case FALL:
            System.out.println("秋天一定要去旅游哦。");
            break;
        case WINTER:
            System.out.println("冬天要是下雪就好啦。");
            break;
        }
    }
    
    public static void main(String[] args) {
        SeasonEnum s = SeasonEnum.SPRING;
        SeasonTest test = new SeasonTest();
        test.judge(s);
    }
}
登入後複製

case表達式中直接寫入枚舉值,不需加入枚舉類別作為限定。

推薦:java基礎教學

#

以上是淺談java枚舉類別(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:cnblogs.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板