java基础——枚举(自学分享)

枚举

介绍

什么是枚举

是一个被命名的整型常数的集合。声明一组带有标识符的常数。
日常生活中很常见:表示星期几——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());//正常	
}

参考地址:
https://www.iteye.com/topic/1116193

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值