java枚举

来源:互联网 发布:windows桌面更新了很久 编辑:程序博客网 时间:2024/04/30 13:08
枚举是 Java 5 开始支持的新特性,其作用是将一组相关的常量定义在一个类型 中,这样在使用时就只能使用这些有限的常量。先定义一个代表一周七天的枚举 类型作为范例: Java 代码 1. enum Weekday { 2. SUNDAY, MONDAY, TUESDAY, WEDNSDAY, THURSDAY, FRIDAY, SATURD AY 3. }; 这样就定义好了一个 Weekday 枚举类型,注意最后的分号是可以省略的。因为 Weekday 中只有 7 个成员,所以 Weekday 的变量只能取其中一个值,例如: Java 代码 1. Weekday wd = Weekday.MONDAY;
这样看起来枚举类型似乎很简单,其实它本质上是一个类,其隐含的父类是 java.lang.Enum,所以 Weekday 自动继承了 Enum 的方法,其中有两个挺有用, 一个叫 ordinal(), 返回成员的声明顺序编号, 这是一个整数, 值从 0 开始编号, 比如 Weekday.SUNDAY.ordinal()返回 0,而 Weekday.MONDAY.ordinal()返回 1。 另一个方法叫做 name(),返回枚举成员的名称。 更有意思的是,枚举类型可以直接用于 switch 语句,这个功能看起来是突破了 Java 中 switch 只能用于整数和字符的限制,不过其实是 Java 编译器的障眼法, Java 编译器会自动在枚举成员上调用 ordinal()方法,例如: Java 代码 1. Weekday wd = Weekday.FRIDAY; 2. switch (wd) { 3. case MONDAY: 4. System.out.println("这个星期才刚开始,慢慢等吧"); 5. break; 6. ... 7. case FRIDAY: 8. System.out.println("周末来了,好好享受吧"); 9. break; 10.... 11.}

如果想遍历 Weekday,那么可以使用它隐含的静态方法 values(),这个方法在文 档中找不到定义,是 Java 编译器自己加上去的,很奇怪! 例如: Java 代码 1. for (Weekday wd : Weekday.values()) { 2. System.out.println(wd + ", 顺序: " + wd.ordinal()); 3. } 以上是枚举的基本用法,实际上枚举本身要复杂的多,比如可以定义构造函数, 定义字段,定义和重写方法,甚至可以在枚举的常量中重写枚举中的方法,这些 内容将在下一篇文章中介绍。

 

—————————————————————————————————————————————————————————

 

DK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。

  用法一:常量

  在JDK1.5 之前,我们定义常量都是: publicstaticfianl…… .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

  public enum Color { RED, GREEN, BLANK, YELLOW }

用法二:switch

  JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。

  enum Signal { GREEN, YELLOW, RED } public class TrafficLight { Signal color = Signal.RED;public void change() { switch (color) { case RED:color = Signal.GREEN;break;case YELLOW:color = Signal.RED;break;case GREEN:color = Signal.YELLOW;break;}

用法三:向枚举中添加新方法

  如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。

  public enum Color { 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 static String getName(int index) { for (Color c : Color.values()) { if (c.getIndex() == index) { return c.name;} return null;} // get set 方法public String getName() { return name;} public void setName(String name) { this.name = name;} public int getIndex() { return index;} public void setIndex(int index) { this.index = index;}

  用法四:覆盖枚举的方法

  下面给出一个toString()方法覆盖的例子。

  public enum Color { 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;} //覆盖方法@Override public String toString() { return this.index+"_"+this.name;}

用法五:实现接口

  所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。

  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;} //接口方法@Override public String getInfo() { return this.name;} //接口方法@Override public void print() { System.out.println(this.index+":"+this.name);}

用法六:使用接口组织枚举

  public interface Food { enum Coffee implements Food{ BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO } enum Dessert implements Food{ FRUIT, CAKE, GELATO }

用法七:关于枚举集合的使用

  java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。

 


原创粉丝点击