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

来源:互联网 发布:java.io jar包下载 编辑:程序博客网 时间:2024/06/13 02:09

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

简介

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

enum常用方法

    T[] valuese()           返回枚举常量数组    int compareTo(E o)          比较此枚举与指定对象的顺序。    Class<E> getDeclaringClass()          返回与此枚举常量的枚举类型相对应的 Class 对象。    String name()          返回此枚举常量的名称,在其枚举声明中对其进行声明。    int ordinal()          返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。    String toString()           返回枚举常量的名称,它包含在声明中。    static <T extends Enum<T>> T valueOf(Class<T> 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 extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal)  构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
  

 /**     * 定义常量     */    public enum Color {        RED, BLUE, DARK    }        // 这段代码实际上调用了3次 Enum(String name, int ordinal):    new Enum<Color>("RED",0);    new Enum<Color>("BLUE",1);    new Enum<Color>("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<Color> colorSet = EnumSet.allOf(Color.class);        for (Color color : colorSet) {            System.out.println("EnumSet: " + color);        }        // EnumMap的使用        EnumMap<Color, String> colorMap = new EnumMap(Color.class);        colorMap.put(Color.RED, "红色");        colorMap.put(Color.BLUE, "红色");        colorMap.put(Color.DARK, "黑色");        for (Iterator<Map.Entry<Color, String>> iter = colorMap.entrySet().iterator(); iter.hasNext();) {            Map.Entry<Color, String> 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(枚举)使用详解 + 总结


0 0
原创粉丝点击