深入理解枚举类型之基础用法

     enum关键字,即枚举,是Java SE5添加的看似很小的特性,实际上特别的好用。

简介

    枚举类型是由关键字enum修饰的, 将一组常量的有限集合创建为新的数据类型。

enum常用方法

    T[] valuese()
           返回枚举常量数组
    int compareTo(E o)
          比较此枚举与指定对象的顺序。

    Class getDeclaringClass()
          返回与此枚举常量的枚举类型相对应的 Class 对象。

    String name()
          返回此枚举常量的名称,在其枚举声明中对其进行声明。

    int ordinal()
          返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

    String toString()
           返回枚举常量的名称,它包含在声明中。

    static > T valueOf(Class enumType, String name)
          返回带指定名称的指定枚举类型的枚举常量。
          如果不存在给定名字的示例,将会抛出异常IllegalArgumentException

 
    示例代码:
    public class TextEnum {
        public static void main(String[] args) {
            Enum colorRed = Color.RED;
            Enum colorBlue = Color.BLUE;
            Enum colorDark = Color.DARK;
            
             // 返回枚举常量数据组
            for (Color c: Color.values()) {
                System.out.println("values: " + c);
            }

            System.out.println("color = " + colorRed );
            //  compareTo比较此枚举与指定对象的顺序
            // A.compareTo(B)
            // 若A在B的后面,返回1
            // 若A在B的前面,返回-1
            System.out.println("compareTo : " + colorBlue.compareTo(colorRed));
            System.out.println("compareTo : " + colorBlue.compareTo(colorDark));
            // getDeclaringClass:返回与此枚举常量的枚举类型相对应的 Class 对象
            // 返回对象的名称包括包名
            System.out.println("getDeclaringClass: " + colorBlue.getDeclaringClass());
            // name:返回此枚举常量的名称,在其枚举声明中对其进行声明
            System.out.println("name: " + colorBlue.name());
            // ordinal:返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)
            System.out.println("ordinal: " + colorBlue.ordinal());
            // toString:返回枚举常量的名称,它包含在声明中
            System.out.println("toString: " + colorBlue.toString());
            // valueOf:返回带指定名称的指定枚举类型的枚举常量
            System.out.println("valueOf: " + Enum.valueOf(Color.class, "RED"));
        }
    }
    // Log打印
    values: RED
    values: BLUE
    values: DARK
    color = RED
    compareTo : 1
    compareTo : -1
    getDeclaringClass: class com.teaphy.observer.enum_.Color
    name: BLUE
    ordinal: 1
    toString: BLUE
    valueOf: RED

语法定义

    创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类 (java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal)  构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
  

 /**
     * 定义常量
     */
    public enum Color {
        RED, BLUE, DARK
    }
    
    // 这段代码实际上调用了3次 Enum(String name, int ordinal):
    new Enum("RED",0);
    new Enum("BLUE",1);
    new Enum("DARK",2);

基本用法

    定义常量

    枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

    public enum Color {
        RED, BLUE, DARK
    }

    switch

    JDK1.6之前的switch语句只支持int,char,enum类型。JDk1.6后switch支持enum。由于switch是要在有限的可能值 集合中进行选择。enum与switch组合是绝佳的,因为enum的名字能清楚的表明程序意欲如何,提高代码的可读性。
    示例代码:

    public class TextEnum {
        public static void main(String[] args) {
                Color colorRed = Color.RED;
                Color colorBlue = Color.BLUE;
                Color colorDark = Color.DARK;

                testSwitch(colorRed);
                testSwitch(colorBlue);
                testSwitch(colorDark);
            }

            private static void testSwitch(Color color) {
                switch (color) {
                    case RED:
                        System.out.println("Switch - color = " + RED);
                        break;
                    case BLUE:
                        System.out.println("Switch - color = " + BLUE);
                        break;
                    case DARK:
                        System.out.println("Switch - color = " + DARK);
                        break;
                    default:
                        break;
                }
            }
        }
    }
    // Log打印
    Switch - color = RED
    Switch - color = BLUE
    Switch - color = DARK

    向enum中添加新方法

     如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且,Java要求必须先定义enum实例,如果在定义enum实例之前定义了任何方法属性,那么编译时会报错。
     enum的构造方法一般有意的将访问权限设置为private.其实设置其他的访问权限也可,对enum没有任何影响。因为我们只能通过enum内部构造器创建enum实例,一旦enum定义结束,JVM将不在允许使用其他构造器来创建enum实例。
     示例代码:

     public enum  ColorWithMethod {
        RED("红色", 1), GREEN("绿色", 2), WHITE("白色", 3), YELLO("黄色", 4);

        // 成员变量
        private String name;
        private int index;
        
        // 构造方法
        private ColorWithMethod(String name, int index) {
            this.name = name;
            this.index = index;
        }

        // 普通方法
        public static String getName(int index) {
            for (ColorWithMethod c : ColorWithMethod.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;
        }

        @Override
        public String toString() {
            return "ColorWithMethod{" +
                    "name='" + name + '\'' +
                    ", index=" + index +
                    '}';
        }
    }
    // 测试类
    public class TextEnum {
        public static void main(String[] args) {
            ColorWithMethod colorWithMethod = ColorWithMethod.WHITE;
            System.out.println("getName: " + colorWithMethod.getName());
            System.out.println("getIndex: " + colorWithMethod.getIndex());
            System.out.println("ordinal: " + colorWithMethod.ordinal());
            colorWithMethod.setName("紫色");
            colorWithMethod.setIndex(10);
            System.out.println("getName: " + colorWithMethod.getName());
            System.out.println("getIndex: " + colorWithMethod.getIndex());
            System.out.println("ordinal: " + colorWithMethod.ordinal());
        }
    }
     // Log
     getName: 白色
    getIndex: 3
    ordinal: 2
    getName: 紫色
    getIndex: 10
    ordinal: 2

    实现接口

     所有的枚举都继承自java.lang.Enum类,而Enum又继承于Object类。因为Java不支持多继承,枚举类不允许再继承其他的类,但是可以实现接口。
     示例代码:

    public enum ColorWithInterface implements IColor{
        RED("红色", 1), GREEN("绿色", 2), WHITE("白色", 3), YELLO("黄色", 4);

        // 成员变量
        private String name;
        private int index;

        // 构造方法
        private ColorWithInterface(String name, int index) {
            this.name = name;
            this.index = index;
        }

        // 普通方法
        public static String getName(int index) {
            for (ColorWithInterface c : ColorWithInterface.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;
        }

        //接口方法
        @Override
        public String getInfo() {
            return this.name;
        }
        //接口方法
        @Override
        public void print() {
            System.out.println(this.index+":"+this.name);
        }

        @Override
        public String toString() {
            return "ColorWithMethod{" +
                    "name='" + name + '\'' +
                    ", index=" + index +
                    '}';
        }
    }
    public class TextEnum {
        public static void main(String[] args) {
                //
            ColorWithInterface colorInterface = ColorWithInterface.GREEN;
            System.out.println("ColorWithInterface - getInfo: " + colorInterface.getInfo());
            IColor iColor = ColorWithInterface.GREEN;
            System.out.println("IColor - getInfo: " + colorInterface.getInfo());
        }
    }
    // Log打印
    ColorWithInterface - getInfo: 绿色
    IColor - getInfo: 绿色

    在接口中定义枚举

    示例代码:

    public interface Food {
        enum Coffee implements Food{
            BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
        }
        enum Dessert implements Food{
            FRUIT, CAKE, GELATO
        }
    }
    public class TextEnum {
        public static void main(String[] args) {
                //
            ColorWithInterface colorInterface = ColorWithInterface.GREEN;
            System.out.println("ColorWithInterface - getInfo: " + colorInterface.getInfo());
            IColor iColor = ColorWithInterface.GREEN;
            System.out.println("IColor - getInfo: " + colorInterface.getInfo());
        }
    }
    // Log打印
    Food: BLACK_COFFEE
    Food: FRUIT

  EnumMapEnumSet用法

    示例代码:

    public enum Color {
        RED, BLUE, DARK
    }
    
    public class TextEnum {
        public static void main(String[] args) {
        // EnumSet的使用
        EnumSet colorSet = EnumSet.allOf(Color.class);
        for (Color color : colorSet) {
            System.out.println("EnumSet: " + color);
        }

        // EnumMap的使用
        EnumMap colorMap = new EnumMap(Color.class);
        colorMap.put(Color.RED, "红色");
        colorMap.put(Color.BLUE, "红色");
        colorMap.put(Color.DARK, "黑色");
        for (Iterator> iter = colorMap.entrySet().iterator(); iter.hasNext();) {
            Map.Entry entry = iter.next();
            System.out.println("EnumMap: " + entry.getKey().name() + ":" + entry.getValue());
        }
    }
    // Log打印
    EnumSet: RED
    EnumSet: BLUE
    EnumSet: DARK
    EnumMap: RED:红色
    EnumMap: BLUE:红色
    EnumMap: DARK:黑色

参考资料

      1.Java编程思想

       2.JAVA EMNU

       3.java enum(枚举)使用详解 + 总结


你可能感兴趣的:(Java)