天天看點

Java 枚舉enum使用詳解

JDK1.5引入了新的類型——枚舉。在 Java 中它雖然算個“小”功能,卻給我的開發帶來了“大”友善。

用法一:常量

在JDK1.5 之前,我們定義常量都是: public static final.... 。現在好了,有了枚舉,可以把相關的常量分組到一個枚舉類型裡,而且枚舉提供了比常量更多的方法。 

Java代碼 

public enum Color

{

    RED, GREEN, BLANK, YELLOW

}

測試代碼

public class Test

{

     public static void main(String[] args)

    {

        Color red = Color.RED;

        System.out.println(red);

    }

}

輸出RED

用法二:switch

JDK1.6之前的switch語句隻支援int,char,enum類型,使用枚舉,能讓我們的代碼可讀性更強。 

Java代碼 

public class EnumTest

{

    public static void main(String[] args)

    {

        ColorEnum color = ColorEnum.RED;

        switch (color)

        {

        case RED:

            color = color.RED;

            break;

        case GREEN:

            color = color.BLANK;

            break;

        case YELLOW:

            color = color.YELLOW;

            break;

        }

        System.out.println(color);

    }

}

輸出RED;

用法三:向枚舉中添加新方法

如果打算自定義自己的方法,那麼必須在enum執行個體序列的最後添加一個分号。而且 Java 要求必須先定義 enum 執行個體。

java代碼

public enum ColorEnum

{

    RED("紅色", 1), GREEN("綠色", 2), BLANK("黑色", 3), YELLOW("黃色", 4);

    private String name;

    private int index;

    private ColorEnum(String name , int index) 

    {

        this.name = name;

        this.index = index;

    }

    public static String getName(int index)

    {

        for (ColorEnum color : ColorEnum.values())

        {

            if (color.index == index)

            {

                return color.name;

            }

        }

        return null;

    }

    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;

    }

}

測試代碼:

public class EnumTest

{

    public static void main(String[] args)

    {

        for(int i=1; i <=4; i++)

        {

            test(i);

        }

    }

    public static void test(int index)

    {

        String name = ColorEnum.getName(index);

        System.out.println(name);

    }

}

輸出:分别輸出    紅色,綠色,黑色,黃色

用法四:覆寫枚舉的方法

下面給出一個toString()方法覆寫的例子。

java代碼:

public enum ColorEnum

{

    RED("紅色", 1), GREEN("綠色", 2), BLANK("黑色", 3), YELLOW("黃色", 4);

    private String name;

    private int index;

    private ColorEnum(String name, int index)

    {

        this.name = name;

        this.index = index;

    }

    // 覆寫方法

    @Override

    public String toString()

    {

        return this.index + "_" + this.name;

    }

}

測試代碼:

public class EnumTest

{

    public static void main(String[] args)

    {

        test();

    }

    public static void test()

    {

        ColorEnum[] values = ColorEnum.values();

        for (ColorEnum color : values)

        {

            String c = color.toString();

            System.out.println(c);

        }

    }

}

輸出:分别輸出     1_紅色, 2_綠色, 3_黑色, 4_黃色;

用法五:實作接口

所有的枚舉都繼承自java.lang.Enum類。由于Java 不支援多繼承,是以枚舉對象不能再繼承其他類。

java代碼:

public interface Behaviour

{

    void print();

    String getInfo();

}

public enum ColorEnum implements Behaviour

{

    RED("紅色", 1), GREEN("綠色", 2), BLANK("黑色", 3), YELLOW("黃色", 4);

    private String name;

    private int index;

    private ColorEnum(String name, int index)

    {

        this.name = name;

        this.index = index;

    }

    @Override

    public void print()

    {

        System.out.println("輸出方法");

    }

    @Override

    public String getInfo()

    {

        return this.index + "_" + this.name();

    }

}

測試代碼:

public class EnumTest

{

    public static void main(String[] args)

    {

        test();

    }

    public static void test()

    {

        ColorEnum[] values = ColorEnum.values();

        for (ColorEnum color : values)

        {

            String c = color.getInfo();

            System.out.println(c);

        }

    }

}

輸出:分别輸出    1_紅色, 2_綠色, 3_黑色, 4_黃色

用法六:使用接口組織枚舉

java代碼

public interface Food{

    enum CoffeeEnum implements Food

    {

        BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO

    }

    enum DessertEnum implements Food

    {

        FRUIT, CAKE, GELATO

    }

}

測試代碼:

public class InterfaceEnum

{

    public static void main(String[] args)

    {

        DessertEnum[] values = Food.DessertEnum.values();

        for (DessertEnum dessert : values)

        {

            System.out.println(dessert + " ");

        }

        System.out.println("=====");

        for (CoffeeEnum coffee : Food.CoffeeEnum.values())

        {

            System.out.println(coffee + " ");

        }

        System.out.println("=====");

        //搞個實作接口,來組織枚舉,簡單講,就是分類吧。

        //如果大量使用枚舉的話,這麼幹,在寫代碼的時候,就很友善調用啦。

        //還有就是個"多态"的功能吧

        Food food = Food.DessertEnum.CAKE;

        System.out.println(food);

        food = CoffeeEnum.BLACK_COFFEE;

        System.out.println(food);

    }

}

輸出:分别輸出    FRUIT     CAKE GELATO =====BLACK_COFFEE     DECAF_COFFEE     LATTE     CAPPUCCINO =====                                               CAKE    BLACK_COFFEE

用法七:關于枚舉集合的使用

java.util.EnumSet和java.util.EnumMap是兩個枚舉集合。EnumSet保證集合中的元素不重複;EnumMap中的 key是enum類型,而value則可以是任意類型。關于這個兩個集合的使用就不在這裡贅述,可以參考JDK文檔。

關于枚舉的實作細節和原理請參考:

參考資料:《ThinkingInJava》第四版 

多說一句,用法4,用法5,枚舉執行個體多個參數也是可以的:

public enum ColorEnum implements Behaviour

{

    RED("紅色", "這是紅色", 1), GREEN("綠色", "這是綠色", 2), BLANK("黑色", "這是黑色", 3), YELLOW("黃色", "這是黃色", 4);

}

轉自:https://blog.csdn.net/qq_27093465/article/details/52180865