美文网首页
枚举的花式使用方法

枚举的花式使用方法

作者: 掩流年 | 来源:发表于2019-11-25 23:40 被阅读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;
        }
    

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

    相关文章

      网友评论

          本文标题:枚举的花式使用方法

          本文链接:https://www.haomeiwen.com/subject/trpswctx.html