本文参照《On Java8》
基本的枚举特性
枚举除了简单的应用之外,我们还可以使用它的基本的特性。
public class EnumClass {
public static void main(String[] args) {
for (EnumType e : EnumType.values()) {
System.out.println(ordinal());
}
String shrub = "CREATE RESTART DELETE";
String[] shrubs = shrub.split("\\s+");
for (String s : shrubs) {
System.out.println(Enum.valueOf(EnumType.class, s));
}
}
}
enum EnumType {
//
CREATE, DELETE, RESTART
}
如上述程序所示,ordinal()方法返回的是一个枚举的次序,枚举再内部实现了 Comparable接口,所以可以使用compareTo方法。也是先了Serializable接口。
神秘的枚举
在枚举中有个奇怪的现象就是,你可以在定义好的枚举中,通过反射看到具有方法values(),但是当你通过反射去看它的父类的时候就会发现,父类中并没有values()方法的接口。
通过反射的程序如下所示:
public class Reflection {
private static Set<String> anaylize(Class<?> thisClass) {
System.out.println("thisClass is " + thisClass);
thisClass.getSuperclass();
for (Type t : thisClass.getGenericInterfaces()) {
System.out.println(t);
}
System.out.println("Base: " + thisClass.getSuperclass());
System.out.println("Methods: ");
Set<String> methods = new TreeSet<>();
for (Method m : thisClass.getMethods()) {
methods.add(m.getName());
}
System.out.println(methods);
return methods;
}
public static void main(String[] args) {
anaylize(Explore.class);
System.out.println("------------------------");
anaylize(Enum.class);
}
}
enum Explore {
/**
*
*/
TJAT, THIS
}
发生这起诡异实践的原因是,因为values()
方法实际上是由编译器给枚举添加的一个static
方法。它将整个枚举Explore
定义成final
类。
自定义的枚举类有个特性,我们都知道所有的 enum
都继承自 Java.lang.Enum
类,在Java中不支持多继承,所以对于枚举而言不能被继承。
有时候我们需要对枚举进行分组,或者说是扩展枚举要怎么做呢?
public interface Food {
enum Appetizer implements Food {
SALAD, SOUP, SPRING_ROLLS;
}
enum MainCourse implements Food {
LASAGNE, BURRITO, PAD_THAI,
LENTILS, HUMMOUS, VINDALOO;
}
enum Dessert implements Food {
TIRAMISU, GELATO, BLACK_FOREST_CAKE,
FRUIT, CREME_CARAMEL;
}
enum Coffee implements Food {
BLACK_COFFEE, DECAF_COFFEE, ESPRESSO,
LATTE, CAPPUCCINO, TEA, HERB_TEA;
}
}
由于枚举不能进行子类化,所以这是唯一的方式使其子类化。
public class TypeOfFood {
public static void main(String[] args) {
Food food = Appetizer.SALAD;
food = MainCourse.LASAGNE;
food = Dessert.GELATO;
food = Coffee.CAPPUCCINO;
}
我们可以使用向上转型的方式来使用它。
网友评论