一定义 (语法)
enum 全称为 enumeration, 中文意为枚举, 枚举简单的说就是一种数据类型, 只不过是这种数据类型只包含自定义的特定数据, 它是一组有共同特性的数据的集合
创建枚举类型是需要用到 enum 关键字, 如:
- public enum Color{
- RED, GREEN, BLUE, BLACK, PINK, WHITE;
- }
enum 的语法看似与 class 不同, 但它实际上就是一个类, 经过编译器编译之后得到一个. class 文件
创建的枚举类型默认是 java.lang.enum < 枚举类型名 >(抽象类) 的子类
每个枚举项的类型都为 public static final
因为 Java 的单继承机制, emum 不能再用 extends 继承其他的类
我们可以使用 javap 命令进行反编译验证
既然 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;
- }
- }
枚举实例的创建过程: 枚举类型符合通用模式 Class Enum<E extends Enum<E>>, 而 E 表示枚举类型的名称枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中, 在这里, 每个值的名称都被转换成一个字符串, 并且序数设置表示了此设置被创建的顺序
- public enum Color{
- RED, GREEN, BLUE, BLACK, PINK, WHITE;
- }
相当于调用了六次 Enum<Color > 构造方法
- Enum < Color > ("RED", 0);
- Enum < Color > ("GREEN", 1);
- Enum < Color > ("BLUE", 2);
- Enum < Color > ("BLACK", 3);
- Enum < Color > ("PINK", 4);
- Enum < Color > ("WHITE", 5);
枚举类型的常用方法:
int compareTo(E o) 比较此枚举与指定对象的顺序
Class<E> getDeclaringClass() 返回与此枚举常量的枚举类型相对应的 Class 对象
String name() 返回此枚举常量的名称, 在其枚举声明中对其进行声明
int ordinal() 返回枚举常量的序数 (它在枚举声明中的位置, 其中初始常量序数为零
String toString() 返回枚举常量的名称, 它包含在声明中
static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量
二常用用法
用法一: 常量
在 JDK1.5 之前, 我们定义常量都是: public static fianl.... 现在好了, 有了枚举, 可以把相关的常量分组到一个枚举类型里, 而且枚举提供了比常量更多的方法
用法二: switch
JDK1.6 之前的 switch 语句只支持 int,char,enum 类型, 使用枚举, 能让我们的代码可读性更强
- enum Color{
- RED, GREEN, BLUE, BLACK, PINK, WHITE;
- }
- public class TestEnum {
- public void changeColor(){
- Color color = Color.RED;
- System.out.println("原色:" + color);
- switch(color){
- case RED:
- color = Color.GREEN;
- System.out.println("变色:" + color);
- break;
- case GREEN:
- color = Color.BLUE;
- System.out.println("变色:" + color);
- break;
- case BLUE:
- color = Color.BLACK;
- System.out.println("变色:" + color);
- break;
- case BLACK:
- color = Color.PINK;
- System.out.println("变色:" + color);
- break;
- case PINK:
- color = Color.WHITE;
- System.out.println("变色:" + color);
- break;
- case WHITE:
- color = Color.RED;
- System.out.println("变色:" + color);
- break;
- }
- }
- public static void main(String[] args){
- TestEnum testEnum = new TestEnum();
- testEnum.changeColor();
- }
- }
用法三: 实现接口
- 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);
- }
- }
用法四: 枚举集合的应用
java.util.EnumSet 和 java.util.EnumMap 是两个枚举集合 EnumSet 保证集合中的元素不重复; EnumMap 中的 key 是 enum 类型, 而 value 则可以是任意类型关于这个两个集合的使用就不在这里赘述, 可以参考 JDK 文档
- public class Test {
- public static void main(String[] args) {
- // EnumSet 的使用
- EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);
- for (EnumTest day : weekSet) {
- System.out.println(day);
- }
- // EnumMap 的使用
- EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);
- weekMap.put(EnumTest.MON, "星期一");
- weekMap.put(EnumTest.TUE, "星期二");
- // ... ...
- for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
- Entry<EnumTest, String> entry = iter.next();
- System.out.println(entry.getKey().name() + ":" + entry.getValue());
- }
- }
- }
三综合实例
- package com.ljq.test;
- /**
- * 枚举用法详解
- *
- * @author jiqinlin
- *
- */
- public class TestEnum {
- /**
- * 普通枚举
- *
- * @author jiqinlin
- *
- */
- public enum ColorEnum {
- red, green, yellow, blue;
- }
- /**
- * 枚举像普通的类一样可以添加属性和方法, 可以为它添加静态和非静态的属性或方法
- *
- * @author jiqinlin
- *
- */
- public enum SeasonEnum {
- // 注: 枚举写在最前面, 否则编译出错
- spring, summer, autumn, winter;
- private final static String position = "test";
- public static SeasonEnum getSeason() {
- if ("test".equals(position))
- return spring;
- else
- return winter;
- }
- }
- /**
- * 性别
- *
- * 实现带有构造器的枚举
- *
- * @author jiqinlin
- *
- */
- public enum Gender{
- // 通过括号赋值, 而且必须带有一个参构造器和一个属性跟方法, 否则编译出错
- // 赋值必须都赋值或都不赋值, 不能一部分赋值一部分不赋值; 如果不赋值则不能写构造器, 赋值编译也出错
- MAN("MAN"), WOMEN("WOMEN");
- private final String value;
- // 构造器默认也只能是 private, 从而保证构造函数只能在内部使用
- Gender(String value) {
- this.value = value;
- }
- public String getValue() {
- return value;
- }
- }
- /**
- * 订单状态
- *
- * 实现带有抽象方法的枚举
- *
- * @author jiqinlin
- *
- */
- public enum OrderState {
- /** 已取消 */
- CANCEL {public String getName(){return "已取消";}},
- /** 待审核 */
- WAITCONFIRM {public String getName(){return "待审核";}},
- /** 等待付款 */
- WAITPAYMENT {public String getName(){return "等待付款";}},
- /** 正在配货 */
- ADMEASUREPRODUCT {public String getName(){return "正在配货";}},
- /** 等待发货 */
- WAITDELIVER {public String getName(){return "等待发货";}},
- /** 已发货 */
- DELIVERED {public String getName(){return "已发货";}},
- /** 已收货 */
- RECEIVED {public String getName(){return "已收货";}};
- public abstract String getName();
- }
- public static void main(String[] args) {
- // 枚举是一种类型, 用于定义变量, 以限制变量的赋值; 赋值时通过枚举名. 值取得枚举中的值
- ColorEnum colorEnum = ColorEnum.blue;
- switch (colorEnum) {
- case red:
- System.out.println("color is red");
- break;
- case green:
- System.out.println("color is green");
- break;
- case yellow:
- System.out.println("color is yellow");
- break;
- case blue:
- System.out.println("color is blue");
- break;
- }
- // 遍历枚举
- System.out.println("遍历 ColorEnum 枚举中的值");
- for(ColorEnum color : ColorEnum.values()){
- System.out.println(color);
- }
- // 获取枚举的个数
- System.out.println("ColorEnum 枚举中的值有"+ColorEnum.values().length+"个");
- // 获取枚举的索引位置, 默认从 0 开始
- System.out.println(ColorEnum.red.ordinal());//0
- System.out.println(ColorEnum.green.ordinal());//1
- System.out.println(ColorEnum.yellow.ordinal());//2
- System.out.println(ColorEnum.blue.ordinal());//3
- // 枚举默认实现了 java.lang.Comparable 接口
- System.out.println(ColorEnum.red.compareTo(ColorEnum.green));//-1
- //--------------------------
- System.out.println("===========");
- System.err.println("季节为" + SeasonEnum.getSeason());
- //--------------
- System.out.println("===========");
- for(Gender gender : Gender.values()){
- System.out.println(gender.value);
- }
- //--------------
- System.out.println("===========");
- for(OrderState order : OrderState.values()){
- System.out.println(order.getName());
- }
- }
- }
来源: http://www.jianshu.com/p/d088d5512ae0