枚举中的枚举

枚举类enum是一个final类,不允许子类扩展。因此要扩展枚举,需要借助于接口。下面的这个例子可以解决枚举中枚举的问题。

 

 

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_FORSET_CAKE,FRUIT,CREME_CARAMEL;
	}
	//咖啡类
	enum Coffee implements Food{
		BLACK_COFFEE,DECAF_COFFEE,ESPRESSO,LATTE,CAPPUCCINO,TEA,HERB_TEA;
	}
}


 

public enum Course {
	APPETIZER(Food.Appetizer.class),
	MAINCOURSE(Food.MainCourse.class),
	DESSERT(Food.Dessert.class),
	COFFEE(Food.Coffee.class);
	private Food[] values;
	private Course(Class<? extends Food> kind){
		values = kind.getEnumConstants();
	}
	public Food randomSelection(){
		return Enums.random(values);
	}
	
	public static void main(String[] args){
		for(int i = 0;i<5;i++){
			for(Course course : Course.values()){
				Food food = course.randomSelection();
				System.out.println(food);
			}
			System.out.println("---");
		}
	}
}


 

public class Enums {
	private static Random rand = new Random(47);
	public static <T extends Enum<T>> T random(Class<T> ec){//T extends Enum<T> 意味着T必须是个枚举
		return random(ec.getEnumConstants());
	}
	public static <T> T random(T[] values){
		return values[rand.nextInt(values.length)];
	}
}


 

你甚至可以封闭地更完美:

public enum Course {
	APPETIZER(Food.Appetizer.class),
	MAINCOURSE(Food.MainCourse.class),
	DESSERT(Food.Dessert.class),
	COFFEE(Food.Coffee.class);
	private Food[] values;
	private Course(Class<? extends Food> kind){
		values = kind.getEnumConstants();
	}
	public Food randomSelection(){
		return Enums.random(values);
	}
	
	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_FORSET_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(Course course : Course.values()){
				Food food = course.randomSelection();
				System.out.println(food);
			}
			System.out.println("---");
		}
	}
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值