枚举
介绍
什么是枚举
是一个被命名的整型常数的集合。声明一组带有标识符的常数。
日常生活中很常见:表示星期几——SUNDAY(周天)、MONDAY(周一)、TUESDAY(周二)、WEDNESDAY(周三)、THURSDAY(周四)、FRIDAY(周五)、SATURDAY(周六)就是一个枚举。
JDK1.5才出现的特性。
可以看成一种受限制的类,有自己的方法。
将有关联关系的常量组织起来,使代码更加易读、安全。
声明枚举
任意两个枚举成员不能具有相同的名称,且它的常数值也必须在该枚举基础类型的范围内。
多个枚举成员使用逗号分隔。
没有显示声明基础类型的枚举,默认就是基础类型int。
(访问权限修饰符) enum 声明的枚举名称{
基础类型;
枚举的成员;
}
package com.cui.test.enums;
//枚举类型
public enum Week {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
//如果枚举不添加任何的方法,枚举值默认是从0开始的有序数值。如下:
//SUNDAY:0,MONDAY:1, TUESDAY:2, WEDNESDAY:3, THURSDAY:4, FRIDAY:5, SATURDAY:6;
}
特点
- 使用关键字enum。
- 默认继承了java.lang.Enum类。java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable接口。
- 非抽象的枚举类默认final修饰的。
- 可以实现一个或多个接口。
- 可以定义新的变量。
- 枚举值都是public static final修饰的。
- 可以定义新的方法。
- 构造器的访问修饰符只能用private。
常用方法
- values()
以数组的形式返回枚举的类型成员。
//测试values()方法
public static void test1(){
Weeks[] values = Weeks.values();
System.out.println(Arrays.toString(values));//[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]
}
- valueOf()
返回带指定名称的指定枚举类型的枚举常量。
//测试valueOf()方法
public static void test2(){
// java.lang.IllegalArgumentException:
//No enum constant com.cui.test.enums.Weeks.TURSDAY
// Weeks valueOf = Weeks.valueOf("TURSDAY");//括号中的字符串在枚举中不存在,会报错。
// System.out.println(valueOf);
Weeks valueOf2 = Weeks.valueOf("TUESDAY");
System.out.println(valueOf2);//TUESDAY
}
- compareTo()
比较两个枚举对象在定义时的顺序。
//测试CompareTo()方法
public static void test3(){
int compareTo = Weeks.MONDAY.compareTo(Weeks.TUESDAY);
int compareTo1 = Weeks.TUESDAY.compareTo(Weeks.MONDAY);
int compareTo2 = Weeks.MONDAY.compareTo(Weeks.WEDNESDAY);
int compareTo3 = Weeks.WEDNESDAY.compareTo(Weeks.MONDAY);
System.out.println(compareTo);//周一和周二的顺序相差-1
System.out.println(compareTo1);//周二和周一的顺序相差1
System.out.println(compareTo2);//周一和周三的顺序相差-2
System.out.println(compareTo3);//周三和周一的顺序相差2
}
- ordinal()
返回枚举成员的位置索引(枚举值的顺序是从0开始的)。
//测试ordinal()方法
public static void test4(){
System.out.println(Weeks.MONDAY.ordinal());//0
System.out.println(Weeks.TUESDAY.ordinal());//1
System.out.println(Weeks.WEDNESDAY.ordinal());//2
System.out.println(Weeks.THURSDAY.ordinal());//3
System.out.println(Weeks.FRIDAY.ordinal());//4
System.out.println(Weeks.SATURDAY.ordinal());//5
System.out.println(Weeks.SUNDAY.ordinal());//6
}
应用场景
- 错误码
- 状态机:switch状态机
常见用法
- 定义常量
以前,定义变量都是通过
public static final 数据类型 变量名称
的方式;JDK1.5开始出现了枚举,常量可以都放在一个枚举类型中,
public enum Coller{
RED,
BLUE,
BLACK,
GREEN,
YELLOW;
}
- switch语句
(处理简单的、容易分类的数据。)
进行多分支判断选择。
只能够测试是否相等。
case语句后面只能是整型或字符型常量或者常量表达式。
case语句的末尾要加break语句,否则会导致分支重叠;
switch语句末尾要加default语句,来检查默认情况或者处理错误情况。
//枚举类型的switch语句
public static void TestWeeks(Weeks weeks){
switch(weeks){
case MONDAY:
weeks = Weeks.MONDAY;
System.out.println(weeks);
break;
case TUESDAY:
weeks = Weeks.TUESDAY;
System.out.println(weeks);
break;
case WEDNESDAY:
weeks = Weeks.WEDNESDAY;
System.out.println(weeks);
break;
case THURSDAY:
weeks = Weeks.THURSDAY;
System.out.println(weeks);
break;
case FRIDAY:
weeks = Weeks.FRIDAY;
System.out.println(weeks);
break;
case SATURDAY:
weeks = Weeks.SATURDAY;
System.out.println(weeks);
break;
case SUNDAY:
weeks = Weeks.SUNDAY;
System.out.println(weeks);
break;
default:
System.out.println("default");
break;
}
}
public static void main(String[] args){
TestWeeks(Weeks.MONDAY);
TestWeeks(Weeks.TUESDAY);
TestWeeks(Weeks.WEDNESDAY);
TestWeeks(Weeks.THURSDAY);
TestWeeks(Weeks.FRIDAY);
TestWeeks(Weeks.SATURDAY);
TestWeeks(Weeks.SUNDAY);
运行结果为:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY
}
- 向枚举中添加新的方法
定义自己的方法
package com.cui.test.enums;
//枚举类型
public enum Weeks {
SUNDAY("周日",0),MONDAY("周一",1), TUESDAY("周二",2), WEDNESDAY("周三",3),
THURSDAY("周四",4),FRIDAY("周五",5), SATURDAY("周六",6);
//成员变量
private String name;
private int num;
//构造方法
Weeks(String name,int num){
this.name = name;
this.num = num;
}
//自定义的方法
public static String getName(int num){
for (Weeks weeks : Weeks.values()) {
if (weeks.getNum() == num) {
return weeks.name;
}
}
return null;
}
//get、set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
//向枚举中添加新的方法
public static void test5(){
System.out.println(Weeks.MONDAY.getName());//周一
System.out.println(Weeks.MONDAY.getNum());//1
System.out.println(Weeks.MONDAY.getName(1));//周一
}
- 实现接口
//枚举类型要实现的接口
public interface EnumInterface {
void show();
void print();
}
//枚举类型实现接口
public enum WeeksImplements implements EnumInterface{
SUNDAY("周日",0),MONDAY("周一",1), TUESDAY("周二",2), WEDNESDAY("周三",3),
THURSDAY("周四",4),FRIDAY("周五",5), SATURDAY("周六",6);
//成员变量
private String name;
private int num;
//构造方法
private WeeksImplements(String name,int num) {
this.name = name;
this.num = num;
}
//覆写实现的方法
public void show(){
System.out.println("实现接口的show方法");
}
//覆写实现的方法
public void print(){
System.out.println("实现接口的print方法");
}
//get、set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
public static void main(String[] args){
WeeksImplements.MONDAY.show();
WeeksImplements.MONDAY.print();
}
运行结果为:
实现接口的show方法
实现接口的print方法
错误码实例
public enum EnumErrorCode {
CODE000(0, "正常"), //
CODE001(1, "验签失败"), //
CODE002(2, "系统异常");
private EnumErrorCode(Integer code, String message) {
this.code = code;
this.message = message;
}
private Integer code;
private String message;
public String code() {
return getCode().toString();
}
public String message() {
return getMessage();
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
public static void main(String[] args){
System.out.println(EnumErrorCode.CODE000.code());//0
System.out.println(EnumErrorCode.CODE000.message());//正常
}