介绍
枚举是JDK1.5之后引入的概念,在层级上他和class属于一个层面的。在JDK1.5 之前,我们定义常量都是: public static fianl… 。很难管理。 枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
举个例子,用于定义有限数量的一组同类常量,例如:
错误级别: 低、中、高、急
一年的四季: 春、夏、秋、冬
在枚举类型中定义的常量是该枚举类型的实例。
枚举的定义格式
权限修饰符 enum 枚举名称 {
实例1,实例2,实例3,实例4;
other code...
}
注意下面代码中枚举以逗号分隔,分号结尾。枚举的括号内可以不加任何的参数,直接写成LOW, MEDIUM, HIGH也是可以的,参考代码段Level2。
public enum Level {
LOW(30), MEDIUM(15), HIGH(7);
private int levelValue;
private Level(int levelValue) {
this.levelValue = levelValue;
}
public int getLevelValue() {
return levelValue;
}
more code...
}
public enum Level2 {
LOW, MEDIUM, HIGH;
private Level() { } //注意,这里的构造方法内不再传入int,与枚举保持一致
more code...
}
枚举类常见方法 Enum
注意枚举类是Enum,而枚举是enum,两个有区别!
//假设上面代码中的Level与下述代码在同一个包中
//switch方法,直接写枚举名即可,不需要l.LOW
public void switchTest(Level l){
switch(l){
case LOW:
...
break;
case MEDIUM:
...
break;
case HIGH:
...
break;
default:
break;
}
}
System.out.println(Level.LOW.name()); //打印LOW
System.out.println(Level.LOW.ordinal()); //打印0,ordinal表示序列,所以LOW第一个就是0
System.out.println(Level.LOW.toString()); //打印LOW
System.out.println(Level.LOW.getLevelValue()); //打印30,这个是自建方法
System.out.println(Level.LOW.compareTo(Level.MEDIUM)); //打印-1,这个方法相当于用LOW.ordinal() - MEDIUM.ordinal()
//上面图中的valueOf方法比较特别,他是会返回一个Level的枚举常量。
//而方法的使用是Enum.valueOf(枚举.class,String 你想要的枚举常量的名字)
Level x = Enum.valueOf(Level.class, "HIGH");
System.out.println(x.ordinal()); //打印2,HIGH的序列
枚举实现接口
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
每个枚举对象,都可以实现自己的抽象方法,举个例子有个抽象类LShow:
//抽象类
public interface LShow{
void show();
}
//各自级别实现自己的show
public enum Level implements LShow{
LOW(30){
@Override
public void show(){ System.out.println("我是低级"); }
}, MEDIUM(15){
@Override
public void show(){ System.out.println("我是中级"); }
},HIGH(7){
@Override
public void show(){ System.out.println("我是高级"); };
}
注意事项
- 一旦定义了枚举,最好不要妄图修改里面的值,除非修改是必要的。
- 枚举类默认继承的是java.lang.Enum类而不是Object类
- 枚举类不能有子类,因为其枚举类默认被final修饰
- 只能有private构造方法,防止外部进行实例化
- switch中使用枚举时,直接使用常量名,不用携带类名
- 不能定义name属性,因为自带name属性
- 不要为枚举类中的属性提供set方法,不符合枚举最初设计初衷。(和第一条一样)