您的位置:首页 > 编程语言 > Java开发

java枚举杂记 2(thinking in java)

2016-11-05 18:11 405 查看

枚举的组织

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

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….
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java enum