枚举的花式使用方法

2019-11-25  本文已影响0人  掩流年

本文参照《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;
    }

我们可以使用向上转型的方式来使用它。

上一篇下一篇

猜你喜欢

热点阅读