java enum

作者: n油炸小朋友 | 来源:发表于2018-06-01 00:26 被阅读66次

    java enum是jdk1.5引入的 ,在java.lang包中。Java Enum类型的语法结构尽管和java类的语法不一样,应该说差别比较大。但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。

    使用

    创建枚举类型要是要enum关键字,是继承java.lang.Enum抽象类的,所以枚举类型不能继承其他类了,但可以实现其他接口。
    枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

    
    public enum EnumTest {
        MON, TUE, WED, THU, FRI, SAT, SUN;
    }
    
    

    这段代码实际上调用了7次 Enum(String name, int ordinal):

    new Enum<EnumTest>("MON",0);
    new Enum<EnumTest>("TUE",1);
    new Enum<EnumTest>("WED",2);
       //......
    
    
    使用switch
    enum Signal {
            GREEN, YELLOW, RED
        }
    
        public class TrafficLight {
            Signal color = Signal.RED;
    
            public void change() {
                switch (color) {
                case RED:
                    color = Signal.GREEN;
                    break;
                case YELLOW:
                    color = Signal.RED;
                    break;
                case GREEN:
                    color = Signal.YELLOW;
                    break;
                }
            }
        }
    
    在枚举类中定义属性和方法

    如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。
    而且 要求必须先定义 enum 实例。

    public enum Color {
            //这里相当于Color RED=new Color("红色", 1); 
            RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
    
            // 成员变量
            private String name;
            private int index;
    
            // 构造方法
            private Color(String name, int index) {
                this.name = name;
                this.index = index;
            }
    
            // 普通方法
            public static String getName(int index) {
                for (Color c : Color.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;
            }
        }
    
    使用接口组织枚举

    无法从enum继承子类,如果需要扩展enum中的元素,在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组。达到将枚举元素进行分组的目的。

    public interface Food {
            enum Coffee implements Food {
                BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
            }
    
            enum Dessert implements Food {
                FRUIT, CAKE, GELATO
            }
        }
    
     for (Food.DessertEnum dessertEnum : Food.DessertEnum.values()) {  
            System.out.print(dessertEnum + "  ");  
        }  
    
    enumMap

    java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。

    Map接口的实现类,其key-value映射中的key是Enum类型;
    其原理就是一个对象数组,数组的下标索引就是根据Map中的key直接获取,即枚举中的ordinal值;
    效率比HashMap高,可以直接获取数组下标索引并访问到元素;

    enum Operate{
        ADD, UPDATE, DELETE; 
    }
    
    public class Main {
    
        public static void main(String[] args) {
            Map<Operate, String> map = new EnumMap<Operate, String>(Operate.class);
    
    
            //put方法
            map.put(Operate.ADD, "add operate");
            map.put(Operate.UPDATE, "update operate");
            map.put(Operate.DELETE, "delete operate");
            
            //重写了toString方法
            System.out.println(map);
            
            //size方法
            System.out.println(map.size());
            
            System.out.println(map.containsKey(Operate.UPDATE));
            System.out.println(map.containsValue("update operate"));
            System.out.println(map.get(Operate.DELETE));
            
            //remove
            map.remove(Operate.UPDATE);
            System.out.println(map);
            
            //key集合
            for(Operate operate:map.keySet()){
                System.out.print(operate + " ");
            }
            
            System.out.println();
            //value集合
            for(String obj:map.values()){
                System.out.print(obj + ",");
            }
            
            System.out.println();
            //key-value集合
            for(Entry<Operate, String> entry:map.entrySet()){
                System.out.print(entry.getKey() + ": " + entry.getValue() + ", ");
            }
    
        }
    }
    

    输出:

    {ADD=add operate, UPDATE=update operate, DELETE=delete operate}
    3
    true
    true
    delete operate
    {ADD=add operate, DELETE=delete operate}
    ADD DELETE 
    add operate,delete operate,
    ADD: add operate, DELETE: delete operate, 
    

    枚举的用法

    (1) 常用于对同一类常量进行分类。如color、weekday
    (2) 声明接口方法时,输入参数类型采用枚举比用原始类型值常量更严谨.
    (3) 常量有时往往不仅仅只是一个值,有可能会包含多个属性,此时很适合用枚举
    (4) 有时常量对象需要从配置文件中读取其描述信息或者UI显示信息,此时也适合用枚举
    (5)

    注意:

    • 枚举类型对象之间的值比较,是可以使用==,直接来比较值,是否相等的。因为在Enum类里面,已经重写了equals方法,而方法里面比较就是直接使用==。
    • 声明枚举属性时最好用public final修饰,使用起来会非常方便 。
    • values()方法是编译器插入到enum定义中的static方法,所以,当你将enum实例向上转型为父类Enum时,values()就不可访问了。解决办法:在Class中有一个getEnumConstants()方法,所以即便Enum接口中没有values()方法,我们仍然可以通过Class对象取得所有的enum实例。

    相关文章

      网友评论

      本文标题:java enum

      本文链接:https://www.haomeiwen.com/subject/ydwcsftx.html