枚举Enum

来源:互联网 发布:隔音棉 知乎 编辑:程序博客网 时间:2024/06/15 16:02
  • 枚举用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。

    Enum是java.lang包中的一个抽象类,实现了Comparable,以及Serializable接口,是jdk1.5提供的新特性,主要是方便习惯用枚举操作的人员,所以在java中枚举事实上处于一种可有可无的地位,毕竟在jdk1.5以前,是不提供枚举的,依然不影响开发,但是通过使用枚举可以提高程序的可读性以及健壮性。另外通过enum关键字修饰的类默认继承自Enum类,若是自定义了构造方法,则所有枚举实例必须调用自定义的构造方法初始化。

  • 首先看一下不使用枚举的例子:

public class Color {    public String name;    public static final Color RED = new Color("红色");    public static final Color GREED = new Color("绿色");    public static final Color BLUE = new Color("蓝色");    public Color(String name){        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
  • 而使用枚举的例子如下(若是定义构造方法,则所有实例必须明确使用此构造方法初始化):
public enum Color1 {    RED("红色"),GREEN("绿色"),BLUE("蓝色");    String name;    Color1(String name){        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
  • 通过使用枚举,我们可以使得代码更清晰,因为它可以描述特定的值,并且有效地防止用户提供无效值。同时也方便了我们轻松获取枚举的取值范围:
public class EnumTest {    @Test    public void test1(){        for(Color1 c : Color1.values()){            System.out.println(c.name()+"-->"+c.ordinal());        }    }}

这里写图片描述

  • 于此同时,在jdk1.5后switch中还加入了对Enum对象的判断功能:
    @Test    public void test2(){        switch (Color1.RED){            case RED:                System.out.println("这是红色");                break;            case GREEN:                System.out.println("这是绿色");                break;            case BLUE:                System.out.println("这是蓝色");                break;        }    }

这里写图片描述

  • 同时我们可以让枚举实现各种接口:
interface ColorInfo {    public void printColor();}public enum Color2 implements ColorInfo {    RED("红色") {        public void printColor() {            System.out.println("最喜欢的颜色是"+name);        }    },    GREEN("绿色") {        public void printColor() {            System.out.println("最富有活力的颜色:"+name);        }    },    BLUE("蓝色") {        public void printColor() {            System.out.println("这是天空的颜色:"+name);        }    };    String name;    Color2(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    } }
  • 使用如下:
    @Test    public void test3(){        for(ColorInfo ci : Color2.values()){            ci.printColor();        }    }

这里写图片描述

  • 当然我们还可以直接在Enum类中定义抽象方法:
public enum Color3 {    RED("红色") {        public void printColor() {            isRed();        }        public void isRed(){            System.out.println("这是一个红色");        }    },    GREEN("绿色") {        public void printColor() {            System.out.println("最富有活力的颜色:" + name);        }    },    BLUE("蓝色") {        public void printColor() {            System.out.println("这是天空的颜色:" + name);        }    };    String name;    Color3(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public abstract void printColor();}

效果是一样的。

  • 另外在java1.5以后加入了EnumSet和EnumMap两个类集的支持,这个了解即可
    @Test    public void test4(){        EnumMap<Color3,String> enumMap = new EnumMap(Color3.class);        enumMap.put(Color3.RED,"红色");        enumMap.put(Color3.GREEN,"绿色");        enumMap.put(Color3.BLUE,"蓝色");        for(Map.Entry<Color3,String> entry : enumMap.entrySet()){             System.out.println(entry.getKey()+"-->"+entry.getValue());        }    }    @Test    public void test5() {        EnumSet<Color3> enumSet = EnumSet.allOf(Color3.class);        Iterator<Color3> iterator = enumSet.iterator();        while(iterator.hasNext()){            iterator.next().printColor();        }    }
原创粉丝点击