coreJava Enum笔记和分析
public class EnumTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE) ");
String input = in.next().toUpperCase();
Size size = Enum.valueOf(Size.class, input);
//这里的Size.class代表匹配的Class对象, 这里是"class enum.Size"
System.out.println("size=" + size);
System.out.println("abbreviation=" + size.getAbbreviation());
if (size == Size.EXTRA_LARGE)
System.out.println("Good job--you paid attention to the _.");
}
}
enum Size {
SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");
//构造枚举值 SMALL("S")
private Size(String abbreviation) {
this.abbreviation = abbreviation;
}
public String getAbbreviation() {
return abbreviation;
}
private String abbreviation;
}
enum很像特殊的class,实际上enum声明定义的类型是一个类。 所有的枚举类型都是类库中Enum类的子类(java.lang.Enum)。它们继承了这个Enum中的许多方法。编译器会将enum类型编译成了一个字节码文件:Size.class
- Size枚举类实际是一个不可以被继承的final类。其枚举值都是Size类型的类静态常量, 我们可以通过下面的方式来得到Size枚举类的一个实例:
Size size=Size.SMALL;
注意:这些枚举值都是public static final的,也就是我们经常所定义的常量方式,因此枚举类中的枚举值最好全部大写。 - 如果需要,可以在枚举类型中添加构造器,方法和域。
-
- 构造器只是在构造枚举常量的时候被调用
- 构造器只能private,不允许有public构造器。 这样可以保证无法构造枚举类的新实例。但枚举类的方法和数据域可以允许外部访问。
下面是java.lang.Enum类的几个方法:
(1) ordinal()方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。Size.SMALL.ordinal("SMALL");//返回结果:0 Size.MEDIUM.ordinal("MEDIUM");//返回结果:1
(2) compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。
Size.SMALL.compareTo(Size.MEDIUM); //返回结果 -1
(3) values()方法: 静态方法,返回一个包含全部枚举值的数组。
Size[] values = Size.values();
(4) toString()方法: 返回枚举常量的名称。
String aSize = Size.SMALL.toString();//将返回"SMALL"
(5) valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。类库中的valueOf方法定义如下:
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name); Size s = Enums.valueOf(Size.class, "SMALL");
(6) equals()方法: 比较两个枚举类对象的引用。