Java 枚举本质

101 阅读1分钟

1、定义枚举

enum Day {
    MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY, SUNDAY;

2、javap 分析class文件

public final class test.Day extends java.lang.Enum<test.Day> {
   // 继承了java.lang.Enum 类
  // 定义了常量  
  public static final test.Day MONDAY;
  public static final test.Day TUESDAY;
  public static final test.Day WEDNESDAY;
  public static final test.Day THURSDAY;
  public static final test.Day FRIDAY;
  public static final test.Day SATURDAY;
  public static final test.Day SUNDAY;
  // 自动添加了values方法  
  public static test.Day[] values();
  // 自动添加了valueOf方法
  public static test.Day valueOf(java.lang.String);
 }

3、demo

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY, SUNDAY;


    public static void main(String[] args)
    {

        Day[] days2 = Day.values();
        System.out.println("day2:"+ Arrays.toString(days2));
        Day day = Day.valueOf("MONDAY");
        System.out.println("day:"+day);


        //创建枚举数组
        Day[] days = new Day[]{Day.MONDAY, Day.TUESDAY, Day.WEDNESDAY,
                Day.THURSDAY, Day.FRIDAY, Day.SATURDAY, Day.SUNDAY};
        for (int i = 0; i < days.length; i++) {
            System.out.println("day[" + i + "].ordinal():" + days[i].ordinal());
        }

        System.out.println("-------------------------------------");
        //通过compareTo方法比较,实际上其内部是通过ordinal()值比较的
        System.out.println("days[0].compareTo(days[1]):" + days[0].compareTo(days[1]));
        System.out.println("days[0].compareTo(days[1]):" + days[0].compareTo(days[2]));

        //获取该枚举对象的Class对象引用,当然也可以通过getClass方法
        Class<?> clazz = days[0].getDeclaringClass();
        System.out.println("clazz:" + clazz);

        System.out.println("-------------------------------------");

        //name()
        System.out.println("days[0].name():" + days[0].name());
        System.out.println("days[1].name():" + days[1].name());

        System.out.println("-------------------------------------");

        System.out.println("days[0].toString():" + days[0].toString());
        System.out.println("days[1].toString():" + days[1].toString());

        System.out.println("-------------------------------------");

        Day d = Enum.valueOf(Day.class, days[0].name());
        Day d2 = Day.valueOf(Day.class, days[0].name());
        System.out.println("d:" + d);
        System.out.println("d2:" + d2);

        // 获取枚举数组
        Day[] array = Day.values();


    }

}