成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java 枚舉類

LiuRhoRamen / 962人閱讀

摘要:返回枚舉值在枚舉類中的索引值就是枚舉值在枚舉聲明中的位置,第一個(gè)枚舉值的索引值為零。這是一個(gè)靜態(tài)方法,用于返回指定枚舉類中指定名稱的枚舉值。

手動(dòng)實(shí)現(xiàn)枚舉類 手動(dòng)實(shí)現(xiàn)枚舉類

實(shí)例有限而且固定的類,在Java里被稱為枚舉類。

早期采用通過定義類的方式來實(shí)現(xiàn),可以采用如下設(shè)計(jì)方式

通過private將構(gòu)造器隱藏起來

把這個(gè)類的所有可能實(shí)例都使用public static final 修飾的類變量來保存

如果與必要,可以提供一些靜態(tài)方法,允許其他程序根據(jù)特定參數(shù)來獲取與之匹配的實(shí)例

使用枚舉類可以使程序更加健壯,避免創(chuàng)建對象的隨意性

Java從JDK1.5后就增加了對枚舉類的支持。

枚舉類入門

Java5新增了一個(gè)enum關(guān)鍵字(它與class、interface關(guān)鍵字的地位相同),用以定義枚舉類。枚舉類是一種特殊的類,它一樣可以有自己的成員變量、方法,可以實(shí)現(xiàn)一個(gè)或多個(gè)接口,也可以定義自己的構(gòu)造器。一個(gè)Java源文件中最多只能定義一個(gè)public訪問權(quán)限的枚舉類,且該Java源文件也必須和該枚舉類的類名相同。

枚舉類可以實(shí)現(xiàn)一個(gè)或多個(gè)接口,使用enum定義的枚舉類默認(rèn)繼承了java.lang.Enum類,而不是默認(rèn)繼承Object類,因此枚舉類不能顯示繼承其他父類。其中java.lang.Enum類實(shí)現(xiàn)了java.lang.Serializable和java.lang.Comparable兩個(gè)接口。

使用enum定義、非抽象的枚舉類默認(rèn)會(huì)使用final修飾,因此枚舉類不能派生子類。

枚舉類的構(gòu)造器只能使用private訪問控制符,如果省略了構(gòu)造器的訪問控制符,則默認(rèn)使用private修飾;如果強(qiáng)制指定訪問控制符,則只能指定private修飾符。

枚舉類的所有實(shí)例必須在枚舉類的第一行顯式列出,否則這個(gè)枚舉類永遠(yuǎn)都不能產(chǎn)生實(shí)例。列出這些實(shí)例時(shí),系統(tǒng)會(huì)自動(dòng)添加public static final 修飾,無須程序員顯式添加。

枚舉類默認(rèn)提供了一個(gè)values()方法,該方法可以很方便地遍歷所有的枚舉值。

public enum SeasonEnum
{
    //在第一行列出4個(gè)枚舉實(shí)例
    SPRING,SUMMER,FALL,WINTER;
}

編譯上面Java程序,將生成一個(gè)SeasonEnum.class文件,這表明枚舉類是一個(gè)特殊的Java類。
所有的枚舉值之間以英文逗號(hào)(,)隔開,枚舉值列舉結(jié)束后以英文分號(hào)作為結(jié)束。這些枚舉值代表了該枚舉類的所有可能的實(shí)例。

public class EnumTest 
{
    public void judge(SeasonEnum s)
    {
        //switch語句里的表達(dá)式可以是枚舉值
        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) 
    {
        //枚舉類默認(rèn)有一個(gè)values()方法,返回該枚舉類的所有實(shí)例
        for(SeasonEnum s : SeasonEnum.values())
        {
            System.out.println(s);
        }
        //使用枚舉實(shí)例時(shí),可通過EnumClass.variable形式來訪問
        new EnumTest().judge(SeasonEnum.SPRING);
    }
}

當(dāng)switch控制表達(dá)式使用枚舉類型時(shí),后面case表達(dá)式中的值直接使用枚舉值的名字,無須添加枚舉類作為限定。
java.lang.Enum類中提供了如下幾個(gè)方法:

int compareTo(E o):該方法用于與指定枚舉對象比較順序,同一個(gè)枚舉實(shí)例只能與相同類型的枚舉實(shí)例進(jìn)行比較。如果該枚舉對象位于指定枚舉對象之后,則返回正整數(shù);如果該枚舉對象位于指定枚舉對象之前,則返回負(fù)整數(shù),否則返回零。

String name():返回此枚舉實(shí)例的名稱,這個(gè)名稱就是定義枚舉類時(shí)列出的所有枚舉值之一。與此方法相比,大多數(shù)程序員應(yīng)該優(yōu)先考慮使用toString()方法,因?yàn)閠oString()方法返回更加用戶友好的名稱。

int ordinal():返回枚舉值在枚舉類中的索引值(就是枚舉值在枚舉聲明中的位置,第一個(gè)枚舉值的索引值為零)。

String toString():返回枚舉常量的名稱,與name方法相似,但toString()方法更常用。

public static > T valueOf(ClassenumType, String name):這是一個(gè)靜態(tài)方法,用于返回指定枚舉類中指定名稱的枚舉值。名稱必須與在該枚舉類中聲明枚舉值時(shí)所用的標(biāo)識(shí)符完全匹配,不允許使用額外的空白字符。

當(dāng)程序使用System.out.println(s)語句來打印枚舉值時(shí),實(shí)際上輸出的是該枚舉值的toString()方法,也就是輸出該枚舉值的名字。

枚舉類的成員變量、方法和構(gòu)造器

枚舉類的實(shí)例只能是枚舉值,而不是隨意地通過new來創(chuàng)建枚舉類對象。

public enum Gender 
{
    MALE,FEMALE;
    //定義一個(gè)public修飾的實(shí)例變量
    private String name;
    public void setName(String name) 
    {
        switch (this) {
        case MALE:
            if (name().equals("男")) 
            {
                this.name = name;
            }
            else 
            {
                System.out.println("參數(shù)錯(cuò)誤");
                return;
            }
            break;
        case FEMALE:
            if (name().equals("女")) 
            {
                this.name = name;
            }
            else 
            {
                System.out.println("參數(shù)錯(cuò)誤");
                return;
            }
            break;
        }
    }
    public String getName() 
    {
        return this.name();
    }
}
public class GenderTest 
{
    public static void main(String[] args) 
    {
        //通過Enum的valueOf()方法來獲取指定枚舉類的枚舉值
        //Gender gender = Enum.valueOf(Gender.class, "FEMALE");
        Gender g = Gender.valueOf("FEMALE");
        g.setName("女");
        System.out.println(g+"代表:"+g.getName());
        g.setName("男");
        System.out.println(g+"代表:"+g.getName());
    }
}

枚舉類通常應(yīng)該設(shè)計(jì)成不可變類,成員變量值不允許改變,將枚舉類的成員變量都使用private final修飾。如果將所有的成員變量都使用final修飾符來修飾,必須在構(gòu)造器里為這些成員變量指定初始值,為枚舉類顯式定義帶參數(shù)的構(gòu)造器。

一旦為枚舉類顯式定義了帶參數(shù)的構(gòu)造器,列出枚舉值時(shí)就必須對應(yīng)地傳入?yún)?shù)。

public enum Gender 
{
    //此處的枚舉值必須調(diào)用對應(yīng)的構(gòu)造器來創(chuàng)建
    MALE("男"),FEMAL("女");
    private final String name;
    private Gender(String name)
    {
        this.name =name;
    }
    public String getName()
    {
        return this.name();
    }
}
實(shí)現(xiàn)接口的枚舉類

枚舉類也可以實(shí)現(xiàn)一個(gè)或多個(gè)接口。與普通類實(shí)現(xiàn)一個(gè)或多個(gè)接口完全一樣,枚舉類實(shí)現(xiàn)一個(gè)或多個(gè)接口時(shí),也需要實(shí)現(xiàn)該接口所包含的方法。

public interface GenderDesc
{
    void info();
}

如果由枚舉類來實(shí)現(xiàn)接口里的方法,則每個(gè)枚舉值在調(diào)用該方法時(shí)都有相同的行為方式(因?yàn)榉椒w完全一樣)。如果需要每個(gè)枚舉值在調(diào)用該方法時(shí)呈現(xiàn)出不同的行為方式,則可以讓每個(gè)枚舉值分別來實(shí)現(xiàn)該方法,每個(gè)枚舉值提供不同的實(shí)現(xiàn)方式,從而讓不同的枚舉值調(diào)用該方法時(shí)具有不同的行為方式。

public enum Gender implements GenderDesc
{
    // 此處的枚舉值必須調(diào)用對應(yīng)構(gòu)造器來創(chuàng)建
    MALE("男")
    // 花括號(hào)部分實(shí)際上是一個(gè)類體部分
    {
        public void info()
        {
            System.out.println("這個(gè)枚舉值代表男性");
        }
    },
    FEMALE("女")
    {
        public void info()
        {
            System.out.println("這個(gè)枚舉值代表女性");
        }
    };
    // 其他部分與codes