传统模式实现Enum
- package com.itlwc;
- class MyEnum {
- public static final int BOY = 0;
- public static final int GIRL = 1;
- }
- class Student {
- String name;
- int age;
- public Student(String name, int age) {
- this.name = name;
- if (age != 0 && age != 1) {
- String errorMsg = "非法性别参数" + age + ",应该为1或者0";
- throw new IllegalArgumentException(errorMsg);
- } else {
- this.age = age;
- }
- }
- }
- public class Test {
- public static void main(String[] args) {
- new Student("lwc", 0);//虽然不报错,但没有使用预定义的常量,逻辑错误
- new Student("nxj", MyEnum.GIRL);
- }
- }
使用传统模式实现枚举几点不足
- 必须单独声明每一个常量,并且赋值
- 接受枚举类型合法必须由开发人员自己开发
- 参数合法性不能在编译时直接指出,只能在运行时看到
使用枚举类型实现
- package com.itlwc;
- enum MyEnum {
- MALE, FAMALE
- }
- class Student {
- String name;
- MyEnum me;
- public Student(String name, MyEnum me) {
- this.name = name;
- this.me = me;
- }
- }
- public class Test {
- public static void main(String[] args) {
- new Student("lwc", 200);//直接报错
- new Student("nxj", MyEnum.MALE);
- }
- }
使用枚举类型实现的优点
- 避免开发枚举值合法性代码,错误在编译时就会发现,提高了开发效率,避免了不必要的错误
枚举(Enum)概述
- 定义语法为
- enum MyEnum{
- MALE,FAMALE
- }
- 自定义枚举都继承java.lang.Enum(抽象类)
- 枚举默认默认实现了java.lang.Comparable接口
- 枚举成员默认都是pubilc static final的(非枚举值可以不是)
- 枚举的成员就是枚举的实例,所以定义枚举类型之后,在编译时就能确定枚举类型有几个实例,
- 分别是什么,在运行期间再无法为枚举类型创建新的实例
- 枚举不可以有public或者protected的构造函数,这样可以保证客户代码不能新建一个枚举的实例
- 虽然枚举和类很相似,声明位置相同,但并不是一个类,他们最大的区别就是
- 类的对象是不确定的,new几次就生成几个,枚举的对象在编译期已经确定好了
Enum遍历
- package com.itlwc;
- enum Week {
- // 编译期已经确定下来Week有8个实例
- SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, STR {
- // 重写了toString方法
- public String toString() {
- return "输入参数有误,参数值范围在0~6";
- }
- };
- }
- public class Test {
- public static void main(String[] args) {
- // 引用枚举里面的值
- System.out.println(Week.SUNDAY);
- System.out.println("----------------------------");
- // 静态方法values()返回定义枚举中枚举值的一个数组
- for (Week w : Week.values()) {
- // ordinal()返回枚举值的位置
- System.out.println(w + "-->所在的顺序是" + w.ordinal());
- }
- System.out.println("----------------------------");
- System.out.println(new Test().getWeek(7));
- }
- public Week getWeek(int i) {
- switch (i) {
- case 0:
- return Week.SUNDAY;
- case 1:
- return Week.MONDAY;
- case 2:
- return Week.TUESDAY;
- case 3:
- return Week.WEDNESDAY;
- case 4:
- return Week.THURSDAY;
- case 5:
- return Week.FRIDAY;
- case 6:
- return Week.SATURDAY;
- default:
- return Week.STR;
- }
- }
- }
- /*
- 打印结果:
- SUNDAY
- ----------------------------
- SUNDAY-->所在的顺序是0
- MONDAY-->所在的顺序是1
- TUESDAY-->所在的顺序是2
- WEDNESDAY-->所在的顺序是3
- THURSDAY-->所在的顺序是4
- FRIDAY-->所在的顺序是5
- SATURDAY-->所在的顺序是6
- 输入参数有误,参数值范围在0~6-->所在的顺序是7
- ----------------------------
- 输入参数有误,参数值范围在0~6
- */
Enum的构造器
简单构造器
- package com.itlwc;
- public enum MyEnum {
- RED(), GREEN(), BLUE();
- // 简单构造器
- MyEnum() {
- }
- public static void main(String[] args) {
- MyEnum c = MyEnum.BLUE;
- System.out.println(c);
- }
- }
- /*
- 打印结果:
- BLUE
- */
- package com.itlwc;
- public enum MyEnum {
- RED("红色"), GREEN("绿色"), BLUE("蓝色");
- String name;
- // 复杂构造器
- MyEnum(String name) {
- this.name = name;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public static void main(String[] args) {
- MyEnum c = MyEnum.BLUE;
- System.out.println(c.getName());
- c.setName("设置的颜色");
- System.out.println(c.getName());
- }
- }
- /*
- 打印结果:
- 蓝色
- 设置的颜色
- */
Enum实现接口
Enum实现接口,Enum中的每个对象都必须实现接口中的抽象方法
- package com.itlwc;
- interface Info {
- public String getColor();
- }
- public enum MyEnum implements Info {
- RED {
- public String getColor() {
- return "红色";
- }
- },
- GREEN {
- public String getColor() {
- return "绿色";
- }
- },
- BLUE {
- public String getColor() {
- return "蓝色";
- }
- };
- public static void main(String[] args) {
- for (MyEnum c : MyEnum.values()) {
- System.out.println(c.ordinal() + "-->" + c.name() + ":"
- + c.getColor());
- }
- }
- }
- /*
- 打印结果:
- 0-->RED:红色
- 1-->GREEN:绿色
- 2-->BLUE:蓝色
- */
Enum中定义抽象方法
Enum中直接定义抽象方法,每个对象必须单独实现抽象方法
- package com.itlwc;
- public enum MyEnum {
- RED {
- public String getColor() {
- return "红色";
- }
- },
- GREEN {
- public String getColor() {
- return "绿色";
- }
- },
- BLUE {
- public String getColor() {
- return "蓝色";
- }
- };
- public abstract String getColor();
- public static void main(String[] args) {
- for (MyEnum c : MyEnum.values()) {
- System.out.println(c.ordinal() + "-->" + c.name() + ":"
- + c.getColor());
- }
- }
- }
- /*
- 打印结果:
- 0-->RED:红色
- 1-->GREEN:绿色
- 2-->BLUE:蓝色
- */
EnumMap对Enum的支持
- package com.itlwc;
- import java.util.EnumMap;
- import java.util.Map;
- enum Color {
- RED, GREEN, BLUE;
- }
- public class Test {
- public static void main(String[] args) {
- EnumMap<Color, String> eMap = new EnumMap<Color, String>(Color.class);
- eMap.put(Color.RED, "红色");
- eMap.put(Color.GREEN, "绿色");
- eMap.put(Color.BLUE, "蓝色");
- for (Map.Entry<Color, String> mapE : eMap.entrySet()) {
- System.out.println(mapE.getKey() + "-->" + mapE.getValue());
- }
- }
- }
- /*
- 打印结果:
- RED-->红色
- GREEN-->绿色
- BLUE-->蓝色
- */
EnumSet对Enum的支持
allOf()静态内部方法,用来将全部内容设置到集合中
- package com.itlwc;
- import java.util.EnumSet;
- import java.util.Iterator;
- enum Color {
- RED, GREEN, BLUE;
- }
- public class Test {
- public static void main(String[] args) {
- EnumSet<Color> eSet = EnumSet.allOf(Color.class);
- Iterator<Color> iter = eSet.iterator();
- while (iter.hasNext()) {
- System.out.println(iter.next());
- }
- }
- }
- /*
- 打印结果:
- RED
- GREEN
- BLUE
- */