Java 枚举类Enum的用法总结

    学过C/C++等语言的人,应该都对Enum类型略知一二。Enum一般用来表示一组相同类型的常量。如性别、日期、月份、颜色等。对这些属性用常 量的好处是显而易见的,不仅可以保证单例,且比较时候可以用”==”来替换equals。是一种好的习惯。JDK1.5之前没有Enum这个类型,那时候 一般用接口常量来替代。有了JavaEnum之后,可以更贴近的表示这种常量。

1、如何使用Java Enum

    简单的用法:JavaEnum简单的用法一般用于代表一组常用常量,可用来代表一类相同类型的常量值。如:

     性别:
     public enum SexEnum {
          male, female;
     }   
    颜色:
    public enum Color {
       RED, BLUE,GREEN,BLACK;
    }

    枚举对象里面的值都必须是唯一的。

    可以通过Enum类型名直接引用该常量,如SexEnum.male,Color.RED.


复杂用法:

    Java为枚举类型提供了一些内置的方法,同时枚举常量还可以有自己的方法。可以很方便的遍历枚举对象,看个下面的例子:

1. WeekDay.java:

    public enum WeekDay {
        Mon("Monday"), Tue("Tuesday"), 
        Wed("Wednesday"), Thu("Thursday"), 
        Fri("Friday"), Sat("Saturday"), Sun("Sunday");
        private final String day;
        private WeekDay(String day) {
             this.day = day;
        }
       public static void printDay(int i){
           switch(i){
              case 1: System.out.println(WeekDay.Mon); break;
              case 2: System.out.println(WeekDay.Tue);break;
              case 3: System.out.println(WeekDay.Wed);break;
              case 4: System.out.println(WeekDay.Thu);break;
              case 5: System.out.println(WeekDay.Fri);break;
              case 6: System.out.println(WeekDay.Sat);break;
              case 7: System.out.println(WeekDay.Sun);break;
              default:System.out.println("wrong number!");
           }
       }   
       public String getDay() {
           return day;
       }
 }
 
  

2、WeekDayTest.java:

    public class WeekDayTest {
      public static void main(String args[]) {
          for (WeekDay day : WeekDay.values()) {
             System.out.println(day + "====>" + day.getDay());
          }
          WeekDay.printDay(5);
      }
    }

输出结果为:

          Mon====>Monday

          Tue====>Tuesday

          Wed====>Wednesday

          Thu====>Thursday

          Fri====>Friday

          Sat====>Saturday

          Sun====>Sunday

          Fri


2、向枚举中添加新方法

      如果打算自定义自己的方法,那么必须在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;
        }
    }


3、enum 对象的常用方法介绍

    int compareTo(E o)                      比较此枚举与指定对象的顺序。

    Class getDeclaringClass()        返回与此枚举常量的枚举类型相对应的 Class 对象。

    String name()                             返回此枚举常量的名称,在其枚举声明中对其进行声明。

    int ordinal()                             返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

    String toString()                    返回枚举常量的名称,它包含在声明中。

    static > T valueOf(Class enumType, String name)   返回带指定名称的指定枚举类型的枚举常量。

/**
 * 枚举测试类
 */
public enum EnumTest {
    MON, TUE, WED, THU, FRI, SAT, SUN;
}

public class Test {
    public static void main(String[] args) {
        EnumTest test = EnumTest.TUE;
        //compareTo(E o)
        switch (test.compareTo(EnumTest.MON)) {
        case -1:
            System.out.println("TUE 在 MON 之前");
            break;
        case 1:
            System.out.println("TUE 在 MON 之后");
            break;
        default:
            System.out.println("TUE 与 MON 在同一位置");
            break;
        }
        //getDeclaringClass()
        System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());
        //name() 和  toString()
        System.out.println("name(): " + test.name());
        System.out.println("toString(): " + test.toString());
        //ordinal(), 返回值是从 0 开始
        System.out.println("ordinal(): " + test.ordinal());
    }
}
输出结果:
     TUE 在 MON 之后
     getDeclaringClass(): com.hmw.test.EnumTest
     name(): TUE
     toString(): TUE
     ordinal(): 1
4、给 enum 自定义属性和方法
    给 enum 对象加一下 value 的属性和 getValue() 的方法:

/**
 * 枚举测试类
 * 
 * @author 何明旺
 */
public enum EnumTest {
        MON(1), TUE(2), WED(3), 
        THU(4), FRI(5), SAT(6) {
             @Override
             public boolean isRest() {
                 return true;
             }
        },
       SUN(0) {
            @Override
            public boolean isRest() {
                return true;
           }
      };
    private int value;
    private EnumTest(int value) {
        this.value = value;
    }
    public int getValue() {
        return value;
    }
    public boolean isRest() {
        return false;
    }
}
public class Test {
    public static void main(String[] args) {
        System.out.println("EnumTest.FRI 的 value = " + EnumTest.FRI.getValue());
    }
}
输出结果:
EnumTest.FRI 的 value = 5

5、EnumSet,EnumMap 的应用

public class Test {
    public static void main(String[] args) {
        // EnumSet的使用
        EnumSet weekSet = EnumSet.allOf(EnumTest.class);
        for (EnumTest day : weekSet) {
            System.out.println(day);
        }
        // EnumMap的使用
        EnumMap weekMap = new EnumMap(EnumTest.class);
        weekMap.put(EnumTest.MON, "星期一");
        weekMap.put(EnumTest.TUE, "星期二");
        // ... ...
        for (Iterator> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
            Entry entry = iter.next();
            System.out.println(entry.getKey().name() + ":" + entry.getValue());
        }
    }
}
6、原理分析

      enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum。EnumTest 经过反编译(javap com.hmw.test.EnumTest 命令)之后得到的内容如下:

public class com.hmw.test.EnumTest extends java.lang.Enum{
    public static final com.hmw.test.EnumTest MON;
    public static final com.hmw.test.EnumTest TUE;
    public static final com.hmw.test.EnumTest WED;
    public static final com.hmw.test.EnumTest THU;
    public static final com.hmw.test.EnumTest FRI;
    public static final com.hmw.test.EnumTest SAT;
    public static final com.hmw.test.EnumTest SUN;
    static {};
    public int getValue();
    public boolean isRest();
    public static com.hmw.test.EnumTest[] values();
    public static com.hmw.test.EnumTest valueOf(java.lang.String);
    com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest);
}
      所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。


      可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。









你可能感兴趣的:(安卓)