<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                <!-- Using Interfaces for Organization --> ## 使用接口組織枚舉 無法從 enum 繼承子類有時很令人沮喪。這種需求有時源自我們希望擴展原 enum 中的元素,有時是因為我們希望使用子類將一個 enum 中的元素進行分組。 在一個接口的內部,創建實現該接口的枚舉,以此將元素進行分組,可以達到將枚舉元素分類組織的目的。舉例來說,假設你想用 enum 來表示不同類別的食物,同時還希望每個 enum 元素仍然保持 Food 類型。那可以這樣實現: ```java // enums/menu/Food.java // Subcategorization of enums within interfaces package enums.menu; 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; } } ``` 對于 enum 而言,實現接口是使其子類化的唯一辦法,所以嵌入在 Food 中的每個 enum 都實現了 Food 接口。現在,在下面的程序中,我們可以說“所有東西都是某種類型的 Food"。 ```java // enums/menu/TypeOfFood.java // {java enums.menu.TypeOfFood} package enums.menu; import static enums.menu.Food.*; public class TypeOfFood { public static void main(String[] args) { Food food = Appetizer.SALAD; food = MainCourse.LASAGNE; food = Dessert.GELATO; food = Coffee.CAPPUCCINO; } } ``` 如果 enum 類型實現了 Food 接口,那么我們就可以將其實例向上轉型為 Food,所以上例中的所有東西都是 Food。 然而,當你需要與一大堆類型打交道時,接口就不如 enum 好用了。例如,如果你想創建一個“枚舉的枚舉”,那么可以創建一個新的 enum,然后用其實例包裝 Food 中的每一個 enum 類: ```java // enums/menu/Course.java package enums.menu; import onjava.*; 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); } } ``` 每一個 Course 的實例都將其對應的 Class 對象作為構造器的參數。通過 getEnumConstants0 方法,可以從該 Class 對象中取得某個 Food 子類的所有 enum 實例。這些實例在 randomSelection() 中被用到。因此,通過從每一個 Course 實例中隨機地選擇一個 Food,我們便能夠生成一份菜單: ```java // enums/menu/Meal.java // {java enums.menu.Meal} package enums.menu; 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 CREME_CARAMEL LATTE *** SOUP BURRITO TIRAMISU ESPRESSO *** ``` 在這個例子中,我們通過遍歷每一個 Course 實例來獲得“枚舉的枚舉”的值。稍后,在 VendingMachine.java 中,我們會看到另一種組織枚舉實例的方式,但其也有一些其他的限制。 此外,還有一種更簡潔的管理枚舉的辦法,就是將一個 enum 嵌套在另一個 enum 內。就像這樣: ```java // enums/SecurityCategory.java // More succinct subcategorization of enums import onjava.*; enum SecurityCategory { STOCK(Security.Stock.class), BOND(Security.Bond.class); Security[] values; SecurityCategory(Class<? extends Security> kind) { 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 ``` Security 接口的作用是將其所包含的 enum 組合成一個公共類型,這一點是有必要的。然后,SecurityCategory 才能將 Security 中的 enum 作為其構造器的參數使用,以起到組織的效果。 如果我們將這種方式應用于 Food 的例子,結果應該這樣: ```java // enums/menu/Meal2.java // {java enums.menu.Meal2} package enums.menu; import onjava.*; 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("***"); } } } ``` 輸出為: ``` SPRING_ROLLS VINDALOO FRUIT DECAF_COFFEE *** SOUP VINDALOO FRUIT TEA *** SALAD BURRITO FRUIT TEA *** SALAD BURRITO CREME_CARAMEL LATTE *** SOUP BURRITO TIRAMISU ESPRESSO *** ``` 其實,這僅僅是重新組織了一下代碼,不過多數情況下,這種方式使你的代碼具有更清晰的結構。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看