枚举类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("---");
}
}
}