枚举类型

一、枚举类型的基本功能

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

二、在枚举中添加方法

①、示例(如何添加)

三、在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
原文地址:https://www.cnblogs.com/rookiechen/p/5725926.html