java enum(枚举)使用详解 + 总结(转载)

原文地址:http://www.cnblogs.com/hyl8218/p/5088287.html

enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。

下面是我在使用 enum 过程中的一些经验和总结,主要包括如下内容:

1.原始的接口定义常量

2.语法(定义)

3.遍历、switch 等常用操作

4.enum 对象的常用方法介绍

5.给 enum 自定义属性和方法

6.EnumSet,EnumMap 的应用

7.enum 的原理分析

8.总结

原始的接口定义常量

publicinterfaceIConstants {

String MON ="Mon";

String TUE ="Tue";

String WED ="Wed";

String THU ="Thu";

String FRI ="Fri";

String SAT ="Sat";

String SUN ="Sun";

}

语法(定义)

创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式Class Enum>,而E表示枚举类型的名称。枚举类型的每一个值都将映射到protected Enum(String name, int ordinal)构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

packagecom.hmw.test;

/**

* 枚举测试类

* @author 何明旺

*/

publicenumEnumTest {

MON, TUE, WED, THU, FRI, SAT, SUN;

}

这段代码实际上调用了7次 Enum(String name, int ordinal):

newEnum("MON",0);

newEnum("TUE",1);

newEnum("WED",2);

... ...

遍历、switch 等常用操作

对enum进行遍历和switch的操作示例代码:

publicclassTest {

publicstaticvoidmain(String[] args) {

for(EnumTest e : EnumTest.values()) {

System.out.println(e.toString());

}

System.out.println("----------------我是分隔线------------------");

EnumTest test = EnumTest.TUE;

switch(test) {

caseMON:

System.out.println("今天是星期一");

break;

caseTUE:

System.out.println("今天是星期二");

break;

// ... ...

default:

System.out.println(test);

break;

}

}

}

输出结果:

MON

TUE

WED

THU

FRI

SAT

SUN

----------------我是分隔线------------------

今天是星期二

enum 对象的常用方法介绍

intcompareTo(E o)

比较此枚举与指定对象的顺序。

ClassgetDeclaringClass()

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

Stringname()

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

intordinal()

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

StringtoString()

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

static> TvalueOf(Class enumType, String name)

返回带指定名称的指定枚举类型的枚举常量。

publicclassTest {

publicstaticvoidmain(String[] args) {

EnumTest test = EnumTest.TUE;

//compareTo(E o)

switch(test.compareTo(EnumTest.MON)) {

case-1:

System.out.println("TUE 在 MON 之前");

break;

case1:

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

给 enum 自定义属性和方法

给 enum 对象加一下 value 的属性和 getValue() 的方法:

packagecom.hmw.test;

/**

* 枚举测试类

*

* @author 何明旺

*/

publicenumEnumTest {

MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) {

@Override

publicbooleanisRest() {

returntrue;

}

},

SUN(0) {

@Override

publicbooleanisRest() {

returntrue;

}

};

privateintvalue;

privateEnumTest(intvalue) {

this.value = value;

}

publicintgetValue() {

returnvalue;

}

publicbooleanisRest() {

returnfalse;

}

}

publicclassTest {

publicstaticvoidmain(String[] args) {

System.out.println("EnumTest.FRI 的 value = "+ EnumTest.FRI.getValue());

}

}

输出结果:

EnumTest.FRI 的 value = 5

EnumSet,EnumMap 的应用

publicclassTest {

publicstaticvoidmain(String[] args) {

// EnumSet的使用

EnumSet weekSet = EnumSet.allOf(EnumTest.class);

for(EnumTest day : weekSet) {

System.out.println(day);

}

// EnumMap的使用

EnumMap weekMap =newEnumMap(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());

}

}

}

原理分析

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

publicclasscom.hmw.test.EnumTestextendsjava.lang.Enum{

publicstaticfinalcom.hmw.test.EnumTest MON;

publicstaticfinalcom.hmw.test.EnumTest TUE;

publicstaticfinalcom.hmw.test.EnumTest WED;

publicstaticfinalcom.hmw.test.EnumTest THU;

publicstaticfinalcom.hmw.test.EnumTest FRI;

publicstaticfinalcom.hmw.test.EnumTest SAT;

publicstaticfinalcom.hmw.test.EnumTest SUN;

static{};

publicintgetValue();

publicbooleanisRest();

publicstaticcom.hmw.test.EnumTest[] values();

publicstaticcom.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是单一继承)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 本文包括:枚举由来如何使用?枚举类特性单例设计模式定义特殊结构枚举星期输出中文的案例枚举类API 枚举(enum)...
    廖少少阅读 2,844评论 2 14
  • enum (enumeration), 是 JDK 1.5 中引入的新特性,在 java.lang 包中。 定义...
    敲代码的本愿阅读 537评论 0 0
  • 一、什么是枚举? 枚举是由一组固定的常量组成的合法值。通过这一定义,我们可以看出枚举的核心在于常量,而且常量是固定...
    Roger_黄阅读 956评论 0 4
  • 原链接:http://www.cnblogs.com/langtianya/p/3757993.html JDK各...
    把爱放下会走更远阅读 1,111评论 0 10
  • 大多时候生活并不是你想象中的样子,可它也总能给你带来惊喜
    这也有人抢阅读 84评论 0 0