java enum

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

使用

创建枚举类型要是要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("MON",0);
new Enum("TUE",1);
new Enum("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 map = new EnumMap(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 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)