- 在接口内部,创建实现该接口的枚举,这些枚举都是该接口的子类,这些枚举的实例都可以用该接口的变量接着,同时也是对实现同一接口的枚举实例的分类;
package chapter19._7;
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 {
TIRAMISSU, GELTO, BLACK_FOREST_CAKE, FRUIT, CREAM_CARAMEL;
}
enum Coffee implements Food {
BLACK_COFFEE, DECAF_COFFEE, ESPRESSO, LATTE, CAPPUCCINO, TEA, HERB_TEA;
}
}
- 因为这些枚举(Appetizer,MainCourse,Dessert,Coffee)都实现了Food接口, 所以这些枚举的实例都能用Food的变量接着;
package chapter19._7;
import static chapter19._7.Food.*;
public class TypeOfFood {
public static void main(String[] args) {
Food food = Appetizer.SALAD;
food = MainCourse.LASAGNE;
food = Dessert.GELTO;
food = Coffee.CAPPUCCINO;
}
}
- 枚举实例APPETIZER等需要一个参数为Class<Appetizer>类型的构造方法,由该构造方法构造完成后,APPETIZER将拥有一个数组,一个全是Appetizer实例的数组;
- 构造函数和Course的enum实例(APPETIZER,MAINCOURSE,DESSERT,COFFEE)是只能对应其中一个的关系;
package chapter19._7;
import chapter19._6.Enums;
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) {
this.values = kind.getEnumConstants();
}
public Food randomSelection() {
return Enums.random(values);
}
}
- 每个Course实例都有一个数组Food[],因为Appetizer,MainCourse,Dessert,Coffee都实现了Food接口,他们的实例都可以用Food的变量接着;
package chapter19._7;
public class Meal {
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("----------");
}
}
}
输出:
SPRING_ROLLS
VINDALOO
FRUIT
DECAF_COFFEE
++++++++++++++++++++
SOUP
VINDALOO
FRUIT
TEA
++++++++++++++++++++
SALAD
BURRITO
FRUIT
TEA
++++++++++++++++++++
SALAD
BURRITO
CREAM_CARAMEL
LATTE
++++++++++++++++++++
SOUP
BURRITO
TIRAMISSU
ESPRESSO
++++++++++++++++++++
- Stock和Bond实现了Security,则Stock和Bond的每个实例都可以用Security的变量接着;
- enum实例可以用enum类的变量接着:SecurityCategory category = Enums.random(SecurityCategory.class);
package chapter19._7;
import chapter19._6.Enums;
public enum SecurityCategory {
STOCK(Security.Stock.class), Bond(Security.Bond.class);
Security[] values;
SecurityCategory(Class<? extends Security> kind) {
this.values = kind.getEnumConstants();
}
interface Security {
enum Stock implements Security { SHORT, LONG, MARGIN }
enum Bond implements Security { MUNICIPAL, JUNK }
}
public Security randomSelection() {
return Enums.random(values);
}
public static void main(String[] args) {
for(int i = 0; i < 10; i++) {
SecurityCategory category = Enums.random(SecurityCategory.class);
System.out.println(category + ": " + category.randomSelection());
}
}
}
输出:
Bond: MUNICIPAL
Bond: MUNICIPAL
STOCK: MARGIN
STOCK: MARGIN
Bond: JUNK
STOCK: SHORT
STOCK: LONG
STOCK: LONG
Bond: MUNICIPAL
Bond: JUNK