枚举 实现内部对象的多例
enum关键 相当于继承Enum抽象类
枚举中的构造方法不能是public
枚举对象放到第一行
枚举可以实现接口
枚举不可以继承其他类
/** * 常用类型(带参数的枚举常量,这个只是在书上不常见,实际使用还是很多的,看懂这个,使用就不是问题啦。) */ private enum TYPE { FIREWALL("firewall"), SECRET("secretMac"), BALANCE("f5"); private String typeName; TYPE(String typeName) { this.typeName = typeName; } /** * 根据类型的名称,返回类型的枚举实例。 * * @param typeName 类型名称 */ public static TYPE fromTypeName(String typeName) { for (TYPE type : TYPE.values()) { if (type.getTypeName().equals(typeName)) { return type; } } return null; } public String getTypeName() { return this.typeName; } }
实现接口
public interface Behaviour { void print(); String getInfo(); }
public enum Color implements Behaviour{ RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4); // 成员变量 private String name; private int index; // 构造方法 private Color(String name, int index) { this.name = name; this.index = index; } //接口方法 public String getInfo(){ return this.name; } //接口方法 public void print() { System.out.println(this.index+":"+this.name); } public static void main(String[] args) { Behaviour behaviour = Color.GREEN; behaviour.print(); } }
内部类形式方法
public enum Color implements Behaviour{ RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4){ public void print() { System.out.println("黄色自己的打印方法"); } }; // 成员变量 private String name; private int index; // 构造方法 private Color(String name, int index) { this.name = name; this.index = index; } //接口方法 public String getInfo(){ return this.name; } //接口方法 public void print() { System.out.println(this.index+":"+this.name); } public static void main(String[] args) { Behaviour behaviour = Color.YELLO; behaviour.print(); } }
枚举类中可以定义抽象方法,但是每个枚举对象都要重写抽象方法
public interface Plant { enum Vegetable implements INumberEnum { POTATO(0, "土豆"), TOMATO(0, "西红柿"); Vegetable(int number, String description) { this.code = number; this.description = description; } private int code; private String description; @Override public int getCode() { return 0; } @Override public String getDescription() { return null; } } enum Fruit implements INumberEnum { APPLE(0, "苹果"), ORANGE(0, "桔子"), BANANA(0, "香蕉"); Fruit(int number, String description) { this.code = number; this.description = description; } private int code; private String description; @Override public int getCode() { return 0; } @Override public String getDescription() { return null; } } } 例:在类中组织 enum 本例和上例效果相同。 public class Plant2 { public enum Vegetable implements INumberEnum {...} // 省略代码 public enum Fruit implements INumberEnum {...} // 省略代码 }
EnumSet和EnumMap Java 中提供了两个方便操作enum的工具类——EnumSet 和 EnumMap。 EnumSet 是枚举类型的高性能 Set 实现。它要求放入它的枚举常量必须属于同一枚举类型。 EnumMap 是专门为枚举类型量身定做的 Map 实现。虽然使用其它的 Map 实现(如HashMap)也能完成枚举类型实例到值得映射,但是使用 EnumMap 会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以 EnumMap 使用数组来存放与枚举类型对应的值。这使得 EnumMap 的效率非常高。 // EnumSet的使用 System.out.println("EnumSet展示"); EnumSet<ErrorCodeEn> errSet = EnumSet.allOf(ErrorCodeEn.class); for (ErrorCodeEn e : errSet) { System.out.println(e.name() + " : " + e.ordinal()); } // EnumMap的使用 System.out.println("EnumMap展示"); EnumMap<StateMachine.Signal, String> errMap = new EnumMap(StateMachine.Signal.class); errMap.put(StateMachine.Signal.RED, "红灯"); errMap.put(StateMachine.Signal.YELLOW, "黄灯"); errMap.put(StateMachine.Signal.GREEN, "绿灯"); for (Iterator<Map.Entry<StateMachine.Signal, String>> iter = errMap.entrySet().iterator(); iter.hasNext();) { Map.Entry<StateMachine.Signal, String> entry = iter.next(); System.out.println(entry.getKey().name() + " : " + entry.getValue()); }