什么是枚举 |
基本用法 |
public enum Size {
SMALL, MEDIUM, LARGE
}
枚举使用enum这个关键字来定义,Size包括三个值,分别表示小、中、大,值一般是大写的字母,多个值之间以逗号分隔。枚举类型可以定义为一个单独的文件,也可以定义在其他类内部。
可以这样使用Size:
Size size = Size.MEDIUM
Size size声明了一个变量size,它的类型是Size,size=Size.MEDIUM将枚举值MEDIUM赋值给size变量。
枚举变量的toString方法返回其字面值,所有枚举类型也都有一个name()方法,返回值与toString()一样,例如:
Size size = Size.SMALL;
System.out.println(size.toString());
System.out.println(size.name());
输出都是SMALL。
枚举的好处 |
class Size {
public static final int SMALL = 0;
public static final int MEDIUM = 1;
public static final int LARGE = 2;
}
枚举的好处是比较明显的:
定义枚举的语法更为简洁。
枚举更为安全,一个枚举类型的变量,它的值要么为null,要么为枚举值之一,不可能为其他值,但使用整形变量,它的值就没有办法强制,值可能就是无效的。
枚举类型自带很多便利方法(如values, valueOf, toString等),易于使用。
基本实现原理 |
枚举类型实际上会被Java编译器转换为一个对应的类,这个类继承了Java API中的java.lang.Enum类。
Enum类有两个实例变量name和ordinal,在构造方法中需要传递,name(), toString(), ordinal(), compareTo(), equals()方法都是由Enum类根据其实例变量name和ordinal实现的。
values和valueOf方法是编译器给每个枚举类型自动添加的,上面的枚举类型Size转换后的普通类的代码大概如下所示:
public final class Size extends Enum {
public static final Size SMALL = new Size("SMALL",0);
public static final Size MEDIUM = new Size("MEDIUM",1);
public static final Size LARGE = new Size("LARGE",2);
private static Size[] VALUES =
new Size[]{SMALL,MEDIUM,LARGE};
private Size(String name, int ordinal){
super(name, ordinal);
}
public static Size[] values(){
Size[] values = new Size[VALUES.length];
System.arraycopy(VALUES, 0,
values, 0, VALUES.length);
return values;
}
public static Size valueOf(String name){
return Enum.valueOf(Size.class, name);
}
}
高级用法 |
比如说,我们看改后的Size代码(这个代码实际意义不大,主要展示语法):
public enum Size {
SMALL {
@Override
public void onChosen() {
System.out.println("chosen small");
}
},MEDIUM {
@Override
public void onChosen() {
System.out.println("chosen medium");
}
},LARGE {
@Override
public void onChosen() {
System.out.println("chosen large");
}
};
public abstract void onChosen();
}