zoukankan      html  css  js  c++  java
  • 枚举类型

    一、枚举类型的基本功能

    ①、定义  ②、遍历  ③、搜索  ④、知识点

    二、在枚举中添加方法

    ①、示例(如何添加)

    三、在Switch中使用Enum的原理

    ①、原理  ②、示例

    四、Enum的values()方法

    ①、values()方法的由来  ②、当没有values()方法,怎么获取Enum下的所有实例

    五、enum可以实现多个接口

    ①、试验  

    六、创建Enmus方法,用来随机选取Enum值

    ①、原理  ②、步骤

    七、使用接口组织枚举

    ①、实现  ②、优点

    回答

    一、枚举类型

    什么是枚举:存放一组具有意义名字的值。

    枚举类型的创建及常用方法

    常用方法:①、Enum.values()获取Enmu内部的实例  ②、Enum e = Enum.value;  e.name()获取名字   e.oridnary() 获取在Enum中的序列。

    ②、通过Enum.valueOf()获取Enmu实例。

    /**
     * Enum的功能:
     * 1、遍历    2、获取序号  3、重写了equal()方法   4、重写toString()方法
     * 5、通过搜索获取Enum实例
     *
     */
    //创建枚举类型
    enum English{TOPIC1,TOPIC2,TOPIC3};
    public class Main {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //遍历Enum获取内部数据
            for(English e : English.values()){
                //获取当前Enum实例在English排序的序号
                int index = e.ordinal();
                //获取当前对象的名字
                String name = e.name();
                System.out.println(index+"  My name is "+name);
            }
            //通过搜索获取Enum实例
            English e = English.valueOf("TOPIC1");
            System.out.println(e.name());
            //获取Enum实例
            English topic = English.TOPIC1;
        }
    
    }
    
    
    /**
      *  output:
      * 0  My name is TOPIC1   说明在第0序列。  感觉就像数组
      * 1  My name is TOPIC2
       * 2  My name is TOPIC3
       * TOPIC1
      */
    Enum

    知识点:1、Enmu实现了equal()、hashCode()和compareTo()方法  2、并且继承了Serialiable接口

    二、在enmu添加方法(1、构造方法 2、方法)

    /**
     * 1、步骤:生成构造方法。
     * 2、创建枚举实例
     * 3、创建具体方法
     *
     */
    public enum Direction {
        //通过构造方法生成的Enum实例
        WEST("西方"),NORTH("北方"),EARTH("东方"),SOUTH("南方");
        private String detail;
        
        //在Enum类中添加构造方法。
        private Direction(String detail){
            this.detail = detail;
        }
        
        //添加具体方法。
        public String getDetail(){
            return detail;
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //调用
            Direction direction = Direction.WEST;
            String str = direction.getDetail();
            System.out.println(str);
        }
    
    }
    Enum

    三、Switch中使用Enum

    enum Color{RED,YELLOW,BLACK};
    public class Main {
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String color = getColor(Color.RED);
        }
        
        public static String getColor(Color color){
            //可以通过switch调用
            switch (color) {
            case RED:
                return "red";
            case YELLOW:
                return "yellow";
            case BLACK:
                return "black";
            default:
                return null;
            }
            
        }
    
    }
    Switch

    为什么Enum可以使用Switch:

    因为Switch会调用 enmu.ordinary():ordinary()返回 enum内容对象在Enum中的序列。

    四、Enum的values()方法

    1、根据源码得知,enum继承Enum类,但是在Enum类的描述中没有values这个方法。那么这个方法是怎么来的呢?

     是编译器生成子类的时候,附加给enum的static方法,而不是从Enum中获取的。

    2、那么如果向上转型为Enum,用什么办法能够获取enum内部所有的对象呢。

    调用class类自带的getEnumConstant()方法:

    enum Test{DATA1,DATA2};
    
    public class Main {
        
        public static void main(String[]args){
            Enum enums = Test.DATA1;
            Enum[] datas = enums.getClass().getEnumConstants();
            for(Enum data:datas){
                System.out.println(data.name());
            }
        }
    }
    View Code

    五、enum实现接口

    任务:继承Generator(),通过next()获取随机enum

    public enum Test implements Generator<Test>{
        TOPIC1,TOPIC2,TOPIC3;
        private Random random = new Random();
        @Override
        public Test next() {
            // TODO Auto-generated method stub
            return values()[random.nextInt(values().length)];
        }
    
    }
    View Code

    六、创建Enums方法,随机选取enum数据

    步骤1、获取enum的Class,通过class获取enum数据  2、创建Random类,调用random.nextInt()获取随机数字 3、返回

    public class Enums {
        private static Random random = new Random();
        public static <T extends Enum<T>> T getRandom(Class<T> c){
            T[] enums = c.getEnumConstants();
            return enums[random.nextInt(enums.length)];
        }
    }

    七:使用接口组织枚举(因为enum无法被继承,所以使用接口是子类化的唯一方法):

    原理:在接口内放置枚举,达到分类的效果。

    步骤1、创建接口 2、在接口内创建枚举 3、接口内的枚举类型继承接口

    public interface Food {
        enum Appetizer implements Food{SALAD,SOUP};
        enum MainCourse implements Food{LASAGNE,HUMMOUS};
        enum Coffee implements Food{TEA,MOCKA};
    }
    public class Main {
        public static void main(String[]args){
            //这样就可以用Food来表示枚举
            Food food = Food.Appetizer.SALAD;
        }
    }

    但是因为是接口,就无法构造方法并实现。(所以为能够构造方法,再进一步封装)

    功能:实现随机获取enum

    public enum Course {
        COFFEE(Food.Coffee.class),
        MAIN(Food.MainCourse.class);
        private Food[] foods;
        private Random random = new Random();
        //从Food接口中获取枚举类型的class,然后获取其中的enum
        private Course(Class<? extends Food> c){
            //获取枚举类型
            foods = c.getEnumConstants();
        }
        
        public Food getRandom(){
            return foods[random.nextInt(foods.length)];
        }
    }

    缺点:返回的类型是两层了:第一层enum的Course类型,第二层是Food类型。容易混淆。

    更为结构化的一种方式,就是将上述两种方式结合。

    public enum Course {
        COFFEE(Food.Coffee.class),
        MAIN(Food.MainCourse.class);
        private Food[] foods;
        private Random random = new Random();
        //从Food接口中获取枚举类型的class,然后获取其中的enum
        private Course(Class<? extends Food> c){
            //获取枚举类型
            foods = c.getEnumConstants();
        }
        
        public interface Food {
            enum Appetizer implements Food{SALAD,SOUP};
            enum MainCourse implements Food{LASAGNE,HUMMOUS};
            enum Coffee implements Food{TEA,MOCKA};
        }
    
        
        public Food getRandom(){
            return foods[random.nextInt(foods.length)];
        }
    }
    View Code
  • 相关阅读:
    uva1610 Party Games
    uva1442 Cav
    uva1609 Foul Play
    uva1608 Non-boring sequences
    uva12174 滑动窗口+预处理
    uva 1451 数形结合
    light oj 1336 sigma function
    找常用词(字符串处理)问题
    指定排序问题
    完数问题
  • 原文地址:https://www.cnblogs.com/rookiechen/p/5725926.html
Copyright © 2011-2022 走看看