枚举策略模式:
package com.price.effective.enum1; public enum Pay { MONDAY(PayType.WEEKDAY), SUNDAY(PayType.WEEKEND); private PayType payType; Pay(PayType payType){ this.payType = payType; } double pay(double hoursworked, double payRate){ return payType.overPay(hoursworked - 8, payRate) + payRate*8; } private enum PayType{ WEEKEND{ @Override double overPay(double hours, double payRate) { return hours * payRate * 3; } }, WEEKDAY{ @Override double overPay(double hours, double payRate) { return hours * payRate; } }; abstract double overPay(double hours, double payRate); } }
package com.price.effective.enum1; import java.util.EnumSet; import java.util.Set; public class TestEnumSet { // 一般的结合是List或者Set, 还有种跟好的办法如下: public static final int STYLE_BOLD = 1 << 0; public static final int STYLE_ITALIC = 1 << 1; // 这样就能够使用位运算来得到一个int型表示的集合,效率较高 public void applyStyles(int styles){ if((styles & STYLE_BOLD) != 0){ System.out.println("BOLD"); } if((styles & STYLE_ITALIC) != 0){ System.out.println("ITALIC"); } } // 下面用EnumSet来实现以下 public enum Style{BOLD, ITALIC}; public void applyStyles(Set<Style> styles){ if(styles.contains(Style.BOLD)){ System.out.println("BOLD"); } if(styles.contains(Style.ITALIC)){ System.out.println("ITALIC"); } } public static void main(String[] args) { TestEnumSet tes = new TestEnumSet(); tes.applyStyles(TestEnumSet.STYLE_BOLD | TestEnumSet.STYLE_ITALIC); tes.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC)); } }
枚举作为Map的key:
package com.price.effective.enum1; import java.util.ArrayList; import java.util.Collection; import java.util.EnumMap; import java.util.List; import java.util.Map; /** * 给动物分类 * * @author cdwangzijian * */ public class TestEnumMap { public static void main(String[] args) { // 一种方式是便利所有的动物,根据类型加入到对应的集合中 // 稍微好一点的可能可以利用类型名称数组来分类,如下: List<Animal>[] animalByType = new List[Animal.Type.values().length]; for (int i = 0 ; i < animalByType.length; i++) { animalByType[i] = new ArrayList<Animal>(); } for (Animal a : Animal.getAnimals()) { animalByType[a.getType().ordinal()].add(a); } printResult(animalByType); Map<Animal.Type, Animal> animalTypeMap = new EnumMap<Animal.Type, Animal>(Animal.Type.class); for (Animal a : Animal.getAnimals()) { animalTypeMap.put(a.getType(), a); } printResult(animalTypeMap.values()); } private static void printResult(Collection<Animal> values) { System.out.println(values); } private static void printResult(List<Animal>[] animalByType) { for (List<Animal> as : animalByType) { System.out.println(as); } } } class Animal{ public static enum Type{LINGZHANG, CAT, FLY}; private String name; private Type type; public Animal(String name, Type type) { this.name = name; this.type = type; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Type getType() { return type; } public void setType(Type type) { this.type = type; } @Override public String toString() { return "name:" + name; } public static List<Animal> getAnimals(){ Animal tiger = new Animal("tiger", Animal.Type.CAT); Animal chiken = new Animal("chiken", Animal.Type.LINGZHANG); Animal monkey = new Animal("monkey", Animal.Type.FLY); List<Animal> animals = new ArrayList<Animal>(); animals.add(tiger); animals.add(chiken); animals.add(monkey); return animals; } }