Java 枚舉 enum 類 class 對比

枚舉是特殊的類,枚舉能實現的類都能實現,但是,某些場景枚舉更方便。博主將以class和enum對比的方式展示枚舉的特性


Talk is cheap. Show me the code

首先,我們定義一個枚舉enum

enum Season1{

    SPRING,//枚舉常量之間用逗號隔開
    SUMMER("夏天"),
    AUTUMN,
    WINTER("冬天");//最後一個枚舉常量後寫分號
    String name;
    public String getName(){
        return name;
    }
    Season1(){}//此處默認構造方法爲私有的(自動添加上了private)(無參構造)
    Season1(String name){//此處默認構造方法爲私有的(自動添加上了private)(有參構造)
        this.name = name;
    }
    
}

然後,再用類class實現相同的定義

class Season2{

    public static final Season2 SPRING = new Season2();
    public static final Season2 SUMMER = new Season2("夏天");
    public static final Season2 AUTUMN = new Season2("秋天");
    public static final Season2 WINTER = new Season2("冬天");

    String name;
    private Season2(String name){this.name = name;}
    private Season2(){}
    public String getName(){
        return name;
    }

}

這裏再展示一下枚舉的高級特性

enum Operator{

    //匿名內部類
    ADD{
        public double calculate(double a ,double b){return a+b;}
    },
    SUBTRACT{
        public double calculate(double a ,double b){return a-b;}
    },
    MULTIPLY{
        public double calculate(double a ,double b){return a*b;}
    },
    DIVIDE{
        public double calculate(double a ,double b){return a/b;}
    };
    /**
     * 因爲枚舉的構造方法是私有的,所以枚舉類是不能有子類的,
     * 所以枚舉嚴格上來說是不能定義抽象方法的,但是枚舉類允許
     * 枚舉常量以匿名內部類的形式實現枚舉類中的抽象方法,所以枚舉
     * 類中是能夠定義抽象方法的(他是一種特例和放寬)
     * 但當定義抽象方法時,枚舉類中的所有枚舉常量都必須實現這個
     * 抽象方法
     */
    public abstract double calculate(double a ,double b);

}

最後使用一個demo操作一下上面的定義

package com.zaomianbao.demo;

/**
 * @Description 枚舉demo
 * @Author zaomianbao
 * @Date 2019/1/28
 **/
public class EnumDemo {

    public static void main(String[] args) {

        //下面4行展示class和enum達到了同一個效果
        Season1 season1 = Season1.SPRING;//獲取枚舉類中的一個枚舉常量SPRING
        Season2 season2 = Season2.SPRING;
        String name = season1.name();//枚舉常量的名稱
        String name2 = season2.getName();
		
		//下面展示枚舉的常用方法
        int ordinal = season1.ordinal();//枚舉常量的序號(枚舉常量在枚舉中是有順序的,從0開始)
        Season1[] values = Season1.values();//靜態方法,返回該枚舉中的所有枚舉常量
        for (Season1 s1 : values) {
            System.out.println(s1);
        }

        //java對c語言的保留(%爲佔位符,s表示字符串,d表示整數)
        System.out.printf("這個枚舉枚舉常量name爲%s,在枚舉中的位置爲%d",name,ordinal);

        Operator[] os = Operator.values();
        for (Operator operator : os) {
            System.out.println(operator.calculate(5, 10));
        }
    }
}

注意:博主將以上代碼全部寫在一個類文件中,只有將EnumDemo聲明成public,結構如下.

package com.zaomianbao.demo;

/**
 * @Description 枚舉demo
 * @Author zaomianbao
 * @Date 2019/1/28
 **/
public class EnumDemo {

}

enum Season1{

}

class Season2{

}

enum Operator{
    
}

總結

枚舉基本特性就是這些,另外,枚舉是實現單例的最簡便的方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章