枚举类型
一、枚举类型的基本功能
①、定义 ②、遍历 ③、搜索 ④、知识点
二、在枚举中添加方法
①、示例(如何添加)
三、在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 */
知识点: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); } }
三、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; } } }
为什么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()); } } }
五、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)]; } }
六、创建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)]; } }