java 基础总结 -- enum 枚举与接口、泛型、集合的使用

时间:2021-01-21 19:22:35
/**
* 随机取得enum中的一个enum实例工具类
* 枚举和泛型的使用
* @author zghw
*
*/
public class Enums {
private static Random random = new Random(47);
/**
* 随机取得enum中的一个enum实例
* @param ec
* @return
*/
public static <T extends Enum<T>> T next(Class<T> ec){
//1.得到枚举列表
T[] enums= ec.getEnumConstants();
//2.根据枚举长度计算取得一个随机数
int ran = random.nextInt(enums.length);
//3.使用随机数作为枚举列表坐标取得一个随机枚举实例
return enums[ran];
}
/**
* 随机取得enum中的一个enum实例
* @param ec
* @return
*/
public static <T> T values(T[] ec){
return ec[random.nextInt(ec.length)];
}
}

package com.zghw.base.enumx;
/**
* 使用枚举组合提供一份菜单例子
* 枚举中的枚举例子
* @author zghw
*
*/
public enum Meal {
APPETIZER(Food.Appetizer.class),
MAINCOURSE(Food.MainCourse.class),
DESSERT(Food.Dessert.class),
COFFEE(Food.Coffee.class);
private Food[] foods;
private Meal(Class<? extends Food> food){
foods=food.getEnumConstants();
}
public Food getFood(){
return Enums.values(foods);
}
/**
* 使用接口组织枚举
* 在一个接口的内部,创建该接口的枚举,以此将元素进行分组,可以达到将枚举元素
* 分类组织的目的
* @author zghw
*/
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 static void main(String[] args) {
for(int i=0 ; i<5; i++){
for(Meal c :Meal.values()){
System.out.println(c.getFood());
}
System.out.println("----------");
}
}
}

package com.zghw.base.enumx;

import java.util.EnumSet;

/**
* EnumSet集合管理枚举实例的使用例子
* @author zghw
*
*/
enum AlarmPoints{
//传感器安放位置
STAIR1,STAIR2,LOBBY,OFFICE1,OFFICE2,OFFICE3,OFFICE4,BATHROOM,UTILITY,KITCHEN;
}
/**
* 跟踪报警器的位置
* @author zghw
*
*/
public class EnumSets {
public static void main(String[] args) {
EnumSet<AlarmPoints> apSet=EnumSet.noneOf(AlarmPoints.class);//创建一个空的枚举集合
apSet.add(AlarmPoints.BATHROOM);//向集合中添加一个enum实例
System.out.println(apSet);
//向集合中一次添加多个enum实例
apSet.addAll(EnumSet.of(AlarmPoints.STAIR1,AlarmPoints.STAIR2,AlarmPoints.KITCHEN));
System.out.println(apSet);
//一次添加所有的enum实例到集合中
apSet=EnumSet.allOf(AlarmPoints.class);
System.out.println(apSet);
//向集合中一次删除多个enum实例
apSet.removeAll(EnumSet.of(AlarmPoints.STAIR1,AlarmPoints.STAIR2,AlarmPoints.KITCHEN));
System.out.println(apSet);
//删除集合中 从OFFICE1到OFFICE4的实例
apSet.removeAll(EnumSet.range(AlarmPoints.OFFICE1, AlarmPoints.OFFICE4));
System.out.println(apSet);
//在enum全部实例中,不存在apSet集合中的其他实例作为一个集合
apSet = EnumSet.complementOf(apSet);
System.out.println(apSet);
}

}

package com.zghw.base.enumx;

import java.util.EnumMap;
import java.util.Map;

/**
* EnumMap和枚举的使用
* EnumMap是一种特殊的Map,它要求其中的键(key)必须来值一个enum
* 我们只能使用enum的实例作为键来调用put()方法,其他操作与使用一般的Map差不多
* 下面演示了命令设计模式的用法。
* 一般来说,命令模式首先需要一个只有但以方法的接口,然后从该接口实现具有各自不同的行为的多个子类。
* 接下来,程序员就可以构造命令对象,并在需要的时候使用它们。
* @author zghw
*
*/
interface Command{
void action();
}
public class EnumMaps {
public static void main(String[] args) {
//创建
EnumMap<AlarmPoints,Command> apMap = new EnumMap<AlarmPoints,Command>(AlarmPoints.class);
//厨房放入一个报警器 添加
apMap.put(AlarmPoints.KITCHEN, new Command(){
@Override
public void action() {
System.out.println("Kitchen fire");
}
});
//卫生间放入一个报警器 添加
apMap.put(AlarmPoints.BATHROOM, new Command(){
@Override
public void action() {
System.out.println("bathroom alert");
}
});
for(Map.Entry<AlarmPoints, Command> e:apMap.entrySet()){
//取得key
System.out.println(e.getKey());
//取得value
e.getValue().action();
}

apMap.get(AlarmPoints.OFFICE1).action();;//如果没有存入到map中,取得的实例为null。
//优点:EnumMap允许程序员改变值对象,而常量相关的方法在编译器就被固定了。
}

}