java enum(枚举类)的使用

枚举类,一般都用在定义常量。

定义

public enum Constant {

    MON("星期一"), TUE("星期二"), WED("星期三"), THU("星期四"), FRI("星期五"), SAT("星期六"), SUN("星期日");

    private String desc;

    private Constant(String desc) {
        this.desc = desc;
    }

	// 非静态方法,属于具体的 Enum 队形 MON,TUE...
    public String getDesc() {
        return desc;
    }
    // 静态方法,属于 Enum 类 Constant
	public static boolean containKey(String key) {
        Constant[] cons = Constant.values();
        for (Constant con : cons) {
            if (con.name().equals(key))
                return true;
        }
        return false;
    }

}

遍历

public class Main {
    public static void main(String[] args) {
        // 遍历
        Constant[] constants = Constant.values();
        for (Constant con : constants) {
            System.out.println(con);
        }
    }
}
-------------------------------------------------------
MON
TUE
WED
THU
FRI
SAT
SUN

enum 对象的常用方法介绍

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

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

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

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

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

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

EnumSet,EnumMap 的应用

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

原理分析

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

警告: 二进制文件Constant包含com.beng.enums.Constant
Compiled from "Constant.java"
public final class com.beng.enums.Constant extends java.lang.Enum {
  public static final com.beng.enums.Constant MON;
  public static final com.beng.enums.Constant TUE;
  public static final com.beng.enums.Constant WED;
  public static final com.beng.enums.Constant THU;
  public static final com.beng.enums.Constant FRI;
  public static final com.beng.enums.Constant SAT;
  public static final com.beng.enums.Constant SUN;
  public static com.beng.enums.Constant[] values();
  public static com.beng.enums.Constant valueOf(java.lang.String);
  public java.lang.String getDesc();
  public static boolean containKey(java.lang.String);
  static {};
}

所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。
所以 static 定义的方法 属于 Enum 类。

总结

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

你可能感兴趣的:(Java基础)