一、概述
- 在jdk1.5之前,我们定义常量都是使用public static final修饰的,较难管理这些常量
- 在jdk1.5之后引入了新的类型--枚举
- 枚举
- 用于定义有限数量的一组相同类型的常量
- 例如一年的四季:春、夏、秋、冬
- 例如错误的级别:低、中、高
- 可以把相关的常量分组到一个枚举类型里,枚举提供了比常量更多的方法
- 在枚举类型中定义的常量是该枚举类型的实例
- 用于定义有限数量的一组相同类型的常量
二、枚举的使用
1、定义枚举的格式
权限修饰符 enum 枚举名称{
实例1,实例2,实例3...;
}
- 举例
public enum Level {
LOW(30), MEDIUM(15), HIGH(7), URGENT(1);
private int levelValue;
private Level(int levelValue) {
this.levelValue = levelValue;
}
public int getLevelValue() {
return levelValue;
}
}
2、枚举类的主要方法
- 在定义枚举类时用的是enum,而Enum是所有java语言枚举类型的公共基本类(注意Enum是抽象类),下面是Enum抽象类的常见方法
返回类型 | 方法名称 | 方法说明 |
int | compareTo(E o) | 比较此枚举与指定对象的顺序,例如按顺序定义了三个枚举对象abc,a和b比是-1,a和c比是-2,c和a比是2 |
boolean | equals(Object other) | 当指定对象等于此枚举常量时,返回true |
Class<?> | getDeclaringClass | 返回与此枚举常量的枚举类型相对应的Class对象 |
Stirng | name() | 返回此枚举常量的名称,在其枚举声明中对其进行声明 |
int | ordinal() | 返回枚举常量的序数(它在枚举声明中的位置,其初始常量序数为0) |
String | toString() | 返回枚举常量的名称,它包含在声明中 |
static<T extends Enum<T>> | static valueOf(Class<T> enumType, String name) | 返回带指定名称的指定枚举类型的枚举常量 |
3、实现接口的枚举类
- 所有的枚举都继承自java.lang.Enum类,由于java不支持多继承,所以枚举对象不能再继承其他类
- 枚举类实现接口后,每个枚举对象都可以实现自己的抽象方法
- 举例
public enum Demo implements Test{
LOW{
@Override
public void say() {
System.out.println("LOW say");
}
},MEDIUM{
@Override
public void say() {
System.out.println("MEDIUM say");
}
},HIGH{
@Override
public void say() {
System.out.println("HIGH say");
}
};
}
interface Test{
void say();
}
三、枚举类注意事项
- 一旦定义了枚举,最好不要妄图修改里面的值,除非修改是必要的
- 枚举类默认继承的是java.lang.Enum类,而不是Object类
- 枚举类不能有子类,因为其枚举类默认被final修饰
- 只能有private构造方法
- switch中使用枚举时,直接使用常量名,不用携带类名
- 举例,在上面的枚举类中加一个方法
public static void choice(Demo demo){
switch (demo){
case LOW:
System.out.println("LOW");
break;
case MEDIUM:
System.out.println("MEDIUM");
break;
case HIGH:
System.out.println("HIGH");
break;
}
- 不能定义name属性,因为自带name属性
- 不要为枚举类中的属性提供set方法,因为不符合枚举最初设计的初衷
- 即第一条注意事项,最好不要修改枚举类里定义好的值