java枚举杂记 2(thinking in java)

来源:互联网 发布:廉租住房软件 编辑:程序博客网 时间:2024/06/06 04:07

枚举的组织

这边创建一个可以组织的枚举,这是书上的例子:

package thinkinginjava.charpter19;import thinkinginjava.utils.Enums;/* * 这是另外的一种组织枚举的方式 */public enum SecurityCategory {    STOCK(Security.Stock.class), BOND(Security.Bond.class);    Security[] values;    //这个所谓的构造方法才是关键的吧,现在的情况是,只要定义了一个枚举对象,那么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 < 5; i++) {            SecurityCategory category = Enums.random(SecurityCategory.class);            //这便是我蒙了,category.randomSelection(),但是现在总算是明白的,因为values已经是有值了。            System.out.println(category+": "+category.randomSelection());        }    }    /*     * result:BOND: MUNICIPALBOND: MUNICIPALSTOCK: MARGINSTOCK: MARGINBOND: JUNK     */}

这是一种组织方式,现在看下食物的类似的组织方式:

package thinkinginjava.charpter19;import thinkinginjava.utils.Enums;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();    }    interface Food {        /*         * this structure seems strange, follow down,         * every enum is food, and then, this make sense.         */        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_LOREST_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) {        /*         * here if you want to make some dinner, you can just         * select any kind of food you want.         * is this program lose the meaning of itself or          * I just want to be lazy?          */        for (int i = 0; i <6; i++) {            for(Meal2 meal: Meal2.values()){                System.out.println(meal.randomSelection());            }            System.out.println("-----------");        }    }    /*print result:SPRING_ROLLSVINDALOOFRUITDECAF_COFFEE-----------SOUPVINDALOOFRUITTEA-----------SALADBURRITOFRUITTEA-----------SALADBURRITOCREME_CARAMELLATTE-----------SOUPBURRITOTIRAMISUESPRESSO-----------SOUPLASAGNEGELATOBLACK_COFFEE-----------*/}

把所有的食物组织到一个类里面,这样看起来,似舒服又不是,但是看起来,是方便管理的,但是就像书上说的,就有更清晰的结构, 因为是放在一起的,这样让我们比较容易的感觉到他们的关系和共性,而不会因为有太多的枚举让我们搞晕~~。

EnumSet的使用

首先只是看例子:

package thinkinginjava.charpter19;/* * 报警器放置地点枚举 */public enum AlarmPoints {    STAIR1,    STAIR2,    LOBBY,    OFFICE1,    OFFICE2,    OFFICE3,    OFFICE4,    BATHROOM,    UTILITY,    KITCHEN}

另外一个文件:

package thinkinginjava.charpter19;import java.util.EnumSet;public class EnumSets {    public static void main(String[] args) {        //just create one empty enum set        EnumSet<AlarmPoints> points = EnumSet.noneOf(AlarmPoints.class);        //then we can add something points into it        points.add(AlarmPoints.BATHROOM);        //then check it         System.out.println(points);        //and add more enum        points.addAll(EnumSet.of(AlarmPoints.STAIR1, AlarmPoints.STAIR2));        System.out.println(points);        //contain all enum instance        points = EnumSet.allOf(AlarmPoints.class);        System.out.println(points);        //remove enum instance from enumest        points.removeAll(EnumSet.of(AlarmPoints.OFFICE1, AlarmPoints.OFFICE2, AlarmPoints.OFFICE3));        System.out.println(points);        //another way to remove enum        points.removeAll(EnumSet.range(AlarmPoints.LOBBY,AlarmPoints.OFFICE4));        System.out.println(points);        //get the enumset element not is points as a Enumset        points = EnumSet.complementOf(points);        System.out.println(points);    }    /**        [BATHROOM]        [STAIR1, STAIR2, BATHROOM]        [STAIR1, STAIR2, LOBBY, OFFICE1, OFFICE2, OFFICE3, OFFICE4, BATHROOM, UTILITY, KITCHEN]        [STAIR1, STAIR2, LOBBY, OFFICE4, BATHROOM, UTILITY, KITCHEN]        [STAIR1, STAIR2, BATHROOM, UTILITY, KITCHEN]        [LOBBY, OFFICE1, OFFICE2, OFFICE3, OFFICE4]     */}

这边的enumSet也是有待研究的,下面我们看下EnumSet的源代码结构:
to continue….

0 0
原创粉丝点击