Java枚举介绍及使用详解

在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。

例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。

在java中如何更好的使用这些“数据集”呢?在jdk1.5之前我们或许会这样写:

static class Grade {
		private Grade() {
		}

		public static final Grade A = new Grade();
		public static final Grade B = new Grade();
		public static final Grade C = new Grade();
		public static final Grade D = new Grade();
		public static final Grade E = new Grade();
	}

将类的构造函数私有,并且在内部new出这几个数据集来供外部使用。其实这样写可能会带来其它问题,在jdk1.5时,出现枚举,更好的解决了这一问题。下面就简单介绍一下枚举的用法吧。

@Test
	public void test() {
		print(Grade.A);
	}

	private void print(Grade grade) {
		System.out.println(grade.toString());
	}

	//定义一个枚举类,里面每一个枚举值就代表一个对象
	enum Grade{
		A,B,C,D,E;
	}

其实枚举类就是一个特殊的Java类,因为我们在声明一个枚举类时,也可以声明属性 方法和构造函数,但是构造函数必须是私有的。如下代码所示:

@Test
	public void test() {
		print(Grade.A);
	}

	private void print(Grade grade) {
		System.out.println(grade.label);
		System.out.println(grade.getLabel());
	}

	enum Grade {
		A("100-91"), B("90-81"), C("80-71"), D("70-60"), E("60-0");
		private String label;

		private Grade(String label) {
			this.label = label;
		}
		
		private String getLabel(){
			return this.label;
		}
		
	}

枚举类还可以定义抽象方法,但是需要枚举值去实现,也可以实现接口或者继承抽象类,如下:

@Test
	public void test() {
		print(Grade.B);
	}

	private void print(Grade grade) {
		System.out.println(grade.label);
		System.out.println(grade.getLabel());
		System.out.println(grade.getCNLebal());
	}

	enum Grade {
		A("100-91") {
			@Override
			public String getCNLebal() {
				return "优秀";
			}
		},
		B("90-81") {
			@Override
			public String getCNLebal() {
				return "良好";
			}
		},
		C("80-71") {
			@Override
			public String getCNLebal() {
				return "一般";
			}
		},
		D("70-60") {
			@Override
			public String getCNLebal() {
				return "及格";
			}
		},
		E("60-0") {
			@Override
			public String getCNLebal() {
				return "差";
			}
		};
		private String label;

		private Grade(String label) {
			this.label = label;
		}

		private String getLabel() {
			return this.label;
		}

		public abstract String getCNLebal();

	}

下面再简单介绍一下Eunm类的常用用法,参见代码吧:

@Test
	public void test() {
		print(Grade.B);
//		Grade.values() 得到所有的枚举值 ,返回一个数组
		System.out.println("分数等级个数为:" + Grade.values().length);
		for (Grade grade : Grade.values()) {
			String name = grade.name();
			System.out.println("当枚举值的name为:" + name);
			int ordinal = grade.ordinal();
			System.out.println("当前枚举值的坐标为:" + ordinal);
		}
		//Grade.valueOf("W")   Grade.valueOf(Grade.class, "E") 将当前字符串转换成一个枚举,如果失败则抛出参数非法异常
		Grade grade = Grade.valueOf("C");
		print(grade);
		Grade grade2 = Grade.valueOf(Grade.class, "E");
		print(grade2);
	}

	private void print(Grade grade) {
		System.out.println(grade.label);
		System.out.println(grade.getLabel());
		System.out.println(grade.getCNLebal());
	}

	enum Grade {
		A("100-91") {
			@Override
			public String getCNLebal() {
				return "优秀";
			}
		},
		B("90-81") {
			@Override
			public String getCNLebal() {
				return "良好";
			}
		},
		C("80-71") {
			@Override
			public String getCNLebal() {
				return "一般";
			}
		},
		D("70-60") {
			@Override
			public String getCNLebal() {
				return "及格";
			}
		},
		E("60-0") {
			@Override
			public String getCNLebal() {
				return "差";
			}
		};
		private String label;

		private Grade(String label) {
			this.label = label;
		}

		private String getLabel() {
			return this.label;
		}

		public abstract String getCNLebal();

	}

在我们的程序中,枚举可以用的地方挺多的,下面以一个项目中的case来举例吧,比如我们android联网请求客户端,两者通信会定义很多code和对应的message,那么在程序中可以利用枚举进行简单的实现:

public enum ServerCode {
    UNKNOWN(-1, "未知错误"),
    SUCCESS(0, "成功"),
    PARSE_ERROR(100,"返回值解析出错!"),
    NET_IO_ERROR(101,"网络通讯出错!");
   
    private int code = 0;
    private String message = "";

    private ServerCode(int errorCode, String message) {
        this.code = errorCode;
        this.message = message;
    }

    public static ServerCode valueOf(int errorCode) {
        for (ServerCode code : values()) {
            if (code.code == errorCode) {
                return code;
            }
        }
        return UNKNOWN;
    }

    public int code() {
        return code;
    }

    @Override
    public String toString() {
        return message;
    }

相信大家都可以看懂上面代码把,这样在程序中就可以为我们省略很多不必要的操作。当然枚举使用的范围不仅于此,还有很多很多。

常用用法说完了,大体总结一下吧:

Java中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。常用方法:
name()
ordinal()
valueof()
values()遍历枚举中所有的枚举值
枚举类的特性:
枚举类是一种特殊形式的java类
声明的每一个枚举值代表枚举类的一个实力对象
与java中的普通类一样,在声明枚举类时,也可以声明属性 方法和构造函数,但枚举类中的构造函数必须为私有的
枚举类可以实现接口或者继承抽象类
JDK5中扩展了switch语句,可以接收int byte char short 枚举
若枚举类只有一个枚举值,则可以当作单利设计模式使用 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值