Enum笔记

//enum是类,里面定义的类型是枚举实例,所以可以有构造函数

 

public enum OzWitch {
// Instances must be defined first, before methods:
WEST("Miss Gulch, aka the Wicked Witch of the West"),
NORTH("Glinda, the Good Witch of the North"),
EAST("Wicked Witch of the East, wearer of the Ruby " +
"Slippers, crushed by Dorothy’s house"),
SOUTH("Good by inference, but missing");
private String description;
// Constructor must be package or private access:
private OzWitch(String description) {
this.description = description;
}
public String getDescription() { return description; }
public static void main(String[] args) {
for(OzWitch witch : OzWitch.values())
print(witch + ": " + witch.getDescription());
}
}

 

======================================================

 

enum Search { HITHER, YON }
public class UpcastEnum {
public static void main(String[] args) {
Search[] vals = Search.values();
Enum e = Search.HITHER; // Upcast
// e.values(); // No values() in Enum
for(Enum en : e.getClass().getEnumConstants())
System.out.println(en);
}
}

 

========================================================

 

这里面的每个enum会被编译成一个类,类实现了Food接口,所以enum类的每个枚举实例也就可以是转换成Food了。

 

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();
}
public interface Food {
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_FOREST_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) {
for(int i = 0; i < 5; i++) {
for(Meal2 meal : Meal2.values()) {
Food food = meal.randomSelection();
System.out.println(food);
}
System.out.println("---");
}
}
}

 

==========================================================

 

//由于枚举是final和static,所以在枚举实例里面实现的方法,只能调用static类型的变量和方法

 

public class CarWash {

 public enum Cycle {
  UNDERBODY {
   void action() {
    System.out.println("Spraying the underbody");
   }
  },
  WHEELWASH {
   void action() {
    System.out.println("Washing the wheels");
   }
  },
  PREWASH {
   void action() {
    System.out.println("Loosening the dirt");
   }
  },
  BASIC {
   void action() {
    System.out.println("The basic wash");
   }
  },
  HOTWAX {
   void action() {
    System.out.println("Applying hot wax");
   }
  },
  RINSE {
   void action() {
    System.out.println("Rinsing");
   }
  },
  BLOWDRY {
   void action() {
    System.out.println("Blowing dry");
   }
  };
  abstract void action();
 }

 EnumSet<Cycle> cycles = EnumSet.of(Cycle.BASIC, Cycle.RINSE);

 public void add(Cycle cycle) {
  cycles.add(cycle);
 }

 public void washCar() {
  for (Cycle c : cycles)
   c.action();
 }

 public String toString() {
  return cycles.toString();
 }
 
 public static void main(String[] args){
  CarWash wash = new CarWash();
  System.out.println(wash);
  wash.washCar();
  // Order of addition is unimportant:
  wash.add(Cycle.BLOWDRY);
  wash.add(Cycle.BLOWDRY); // Duplicates ignored
  wash.add(Cycle.RINSE);
  wash.add(Cycle.HOTWAX);
  System.out.println(wash);
  wash.washCar();
 }

}

 

//或者可以覆盖方法:

 

public enum OverrideConstantSpecific {
NUT, BOLT,
WASHER {
void f() { print("Overridden method"); }
};
void f() { print("default behavior"); }
public static void main(String[] args) {
for(OverrideConstantSpecific ocs : values()) {
printnb(ocs + ": ");
ocs.f();
}
}
}

 

=======================================================

 

Multiple dispatching(这里只列出两种方法):

这意思就是,当所有变量都不知道类型时,如何执行方法调用。

public class Enums {

 private static Random rand = new Random(47);

 public static <T extends Enum<T>> T random(Class<T> ec) {
  return random(ec.getEnumConstants());
 }

 public static <T> T random(T[] values) {
  return values[rand.nextInt(values.length)];
 }

}

interface Competitor<T extends Competitor<T>> {
 Outcome compete(T competitor);
 }

public class RoShamBo {
 public static <T extends Competitor<T>> void match(T a, T b) {
  System.out.println(a + " vs. " + b + ": " + a.compete(b));
 }

 public static <T extends Enum<T> & Competitor<T>> void play(
   Class<T> rsbClass, int size) {
  for (int i = 0; i < size; i++)
   match(Enums.random(rsbClass), Enums.random(rsbClass));
 }
}

====================

方法一:

 

enum RoShamBo5 implements Competitor<RoShamBo5> {
 PAPER, SCISSORS, ROCK;
 static EnumMap<RoShamBo5, EnumMap<RoShamBo5, Outcome>> table = new EnumMap<RoShamBo5, EnumMap<RoShamBo5, Outcome>>(
   RoShamBo5.class);
 static {
  for (RoShamBo5 it : RoShamBo5.values())
   table.put(it, new EnumMap<RoShamBo5, Outcome>(RoShamBo5.class));
  initRow(PAPER, DRAW, LOSE, WIN);
  initRow(SCISSORS, WIN, DRAW, LOSE);
  initRow(ROCK, LOSE, WIN, DRAW);
 }

 static void initRow(RoShamBo5 it, Outcome vPAPER, Outcome vSCISSORS,
   Outcome vROCK) {
  EnumMap<RoShamBo5, Outcome> row = RoShamBo5.table.get(it);
  row.put(RoShamBo5.PAPER, vPAPER);
  row.put(RoShamBo5.SCISSORS, vSCISSORS);
  row.put(RoShamBo5.ROCK, vROCK);
 }

 public Outcome compete(RoShamBo5 it) {
  return table.get(this).get(it);
 }

 public static void main(String[] args) {
  RoShamBo.play(RoShamBo5.class, 20);
 }
}

 

 

方法二:

enum RoShamBo6 implements Competitor<RoShamBo6> {
 PAPER, SCISSORS, ROCK;
 private static Outcome[][] table = {
  { DRAW, LOSE, WIN }, // PAPER
   { WIN, DRAW, LOSE }, // SCISSORS
   { LOSE, WIN, DRAW }, // ROCK
 };

 public Outcome compete(RoShamBo6 other) {
  return table[this.ordinal()][other.ordinal()];
 }

 public static void main(String[] args) {
  RoShamBo.play(RoShamBo6.class, 20);
 }
}

你可能感兴趣的:(String,Random,action,interface,Constructor,Duplicates)