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

/**
 * 随机取得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允许程序员改变值对象,而常量相关的方法在编译器就被固定了。
	}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值