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 extends Enum> T valueOf(Class enumType, String name)
    返回带指定名称的指定枚举类型的枚举常量。

EnumSet,EnumMap 的应用
public class Test {
    public static void main(String[] args) {
        // EnumSet的使用
        EnumSet<EnumTest> weekSet = EnumSet.allOf(Constant.class);
        for (Constant day : weekSet) {
            System.out.println(day);
        }
 
        // EnumMap的使用
        EnumMap<Constant, String> weekMap = new EnumMap(Constant.class);
        weekMap.put(Constant.MON, "星期一");
        weekMap.put(Constant.TUE, "星期二");
        // ... ...
        for (Iterator<Entry<Constant, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
            Entry<Constant, String> 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<com.beng.enums.Constant> {
  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是单一继承)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值