java枚举杂记 2(thinking in java)

枚举的组织

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

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: MUNICIPAL
BOND: MUNICIPAL
STOCK: MARGIN
STOCK: MARGIN
BOND: 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_ROLLS
VINDALOO
FRUIT
DECAF_COFFEE
-----------
SOUP
VINDALOO
FRUIT
TEA
-----------
SALAD
BURRITO
FRUIT
TEA
-----------
SALAD
BURRITO
CREME_CARAMEL
LATTE
-----------
SOUP
BURRITO
TIRAMISU
ESPRESSO
-----------
SOUP
LASAGNE
GELATO
BLACK_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….

猜你喜欢

转载自blog.csdn.net/qungxue/article/details/53046549
今日推荐