枚舉類型進階1:使用接口組織枚舉

對於enum而言,實現接口是其實現子類化的唯一辦法。在一個接口的內部,創建實現該接口的枚舉,以此將元素進行分組,可以達到將枚舉元素分類組織的目的。如下示例,用enum來表示不同類別的食物,但同時希望每個enum元素仍然保持Food類型。

package enumerated.menu;
import net.mindview.util.*;

public enum Meal2 {
APPETIZER(Food.Appetizer.class), MAINCOURSE(Food.MainCourse.class), DESSERT(
Food.Dessert.class), COFFEE(Food.Coffee.class);
private Food[] values;

private Meal2(Class<? extends Food> kind) {
values = kind.getEnumConstants();
}

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 Food randomSelection() {
return Enums.random(values);
}

public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
for (Meal2 meal : Meal2.values()) {
Food food = meal.randomSelection();
System.out.println(food);
}
System.out.println("---");
}
}
}


下面是Enums工具類,實現從枚舉實例中隨機選擇,<T extends Enum<T>>表示T是一個枚舉實例。將Class<T>作爲參數,就可以利用Class對象得到enum實例的數組了。重裝後的random()方法只需要使用T[]作爲參數,它從數組中隨機選擇一個元素。
//: net/mindview/util/Enums.java
package net.mindview.util;
import java.util.*;

public class Enums {
private static Random rand = new Random(47);
public static <T extends Enum<T>> T random(Class<T> ec) {
return random(ec.getEnumConstants());
}
public static <T> T random(T[] values) {
return values[rand.nextInt(values.length)];
}
} ///:~

輸出結果:
SPRING_ROLLS
VINDALOO
FRUIT
DECAF_COFFEE
---
SOUP
VINDALOO
FRUIT
TEA
---
SALAD
BURRITO
FRUIT
TEA
---
SALAD
BURRITO
CREME_CARAMEL
LATTE
---
SOUP
BURRITO
TIRAMISU
ESPRESSO
---
嵌入在Food中的每個enum都實現了Food接口,該接口的作用就是將其所包含的enum組合成一個公共類型,這一點是必要的。然後Meal2才能將Food中的enum作爲構造器參數使用,每一個Meal2實例都將其對應的class實例對象作爲構造器參數。通過getEnumConstants()方法,可以取得某個Food子類的所有enum實例。這些實例在randomSelection中被用到。因此可以從Meal2實例中隨機選擇一個Food,生成一份菜單。我們通過遍歷每一個Meal2實例得到“枚舉的枚舉”的值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章