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….
相关文章推荐
- thinking-in-java(19)枚举类型
- 简单了解Java枚举类型 —— From Thinking In Java(Fourth Eition)
- 《thinking in java》笔记7-枚举
- 《thinking in java》学习手记(四)
- Thinking in java Chapter 1 笔记
- 《Core Java 2》与《Thinking in Java》之我见:)
- 《Thinking in Java》读书笔记
- Thinking in Java 中文版 2
- 重温Thinking in Java(一)
- 《Thinking in Java》读书笔记(一)
- 《Thinking in Java》读书笔记(二)
- Reading "Thinking in Java" #2
- 《Thinking in Java》学习笔记(一)——对象导论
- this关键字的使用(摘录Thinking In Java)
- 【Notes】《Thinking in Java》【Chapter 11】Part II
- 《Thinking in Java》读书笔记(更新中2005.11.08)
- Thinking in Java中文版 1
- Reading "Thinking in Java" #5
- 很多人知道《Thinking in Java》吧,那么《Thinking in C#》呢?
- java 线程[摘抄至《Thinking in Java》]