`
dawuafang
  • 浏览: 1104646 次
文章分类
社区版块
存档分类
最新评论

Java中的Enum的使用与分析

 
阅读更多

示例:

public enum EnumTest {
FRANK("The given name of me"),
LIU("The family name of me");
private String context;
private String getContext(){
return this.context;
}
private EnumTest(String context){
this.context = context;
}
public static void main(String[] args){
for(EnumTest name :EnumTest.values()){
System.out.println(name+" : "+name.getContext());
}
System.out.println(EnumTest.FRANK.getDeclaringClass());
}

}

Java中枚举实现的分析:

示例:

  1. publicenumColor{
  2. RED,BLUE,BLACK,YELLOW,GREEN
  3. }

显然,enum很像特殊的class,实际上enum声明定义的类型就是一个类。而这些类都是类库中Enum类的子类(java.lang.Enum<E>)。它们继承了这个Enum中的许多有用的方法。我们对代码编译之后发现,编译器将enum类型单独编译成了一个字节码文件:Color.class。

Color字节码代码
  1. finalenumhr.test.Color{
  2. //所有的枚举值都是类静态常量
  3. publicstaticfinalenumhr.test.ColorRED;
  4. publicstaticfinalenumhr.test.ColorBLUE;
  5. publicstaticfinalenumhr.test.ColorBLACK;
  6. publicstaticfinalenumhr.test.ColorYELLOW;
  7. publicstaticfinalenumhr.test.ColorGREEN;
  8. privatestaticfinalsynthetichr.test.Color[]ENUM$VALUES;
  9. //初始化过程,对枚举类的所有枚举值对象进行第一次初始化
  10. static{
  11. 0newhr.test.Color[1]
  12. 3dup
  13. 4ldc<String"RED">[16]//把枚举值字符串"RED"压入操作数栈
  14. 6iconst_0//把整型值0压入操作数栈
  15. 7invokespecialhr.test.Color(java.lang.String,int)[17]//调用Color类的私有构造器创建Color对象RED
  16. 10putstatichr.test.Color.RED:hr.test.Color[21]//将枚举对象赋给Color的静态常量RED。
  17. .........枚举对象BLUE等与上同
  18. 102return
  19. };
  20. //私有构造器,外部不可能动态创建一个枚举类对象(也就是不可能动态创建一个枚举值)。
  21. privateColor(java.lang.Stringarg0,intarg1){
  22. //调用父类Enum的受保护构造器创建一个枚举对象
  23. 3invokespecialjava.lang.Enum(java.lang.String,int)[38]
  24. };
  25. publicstatichr.test.Color[]values();
  26. //实现Enum类的抽象方法
  27. publicstatichr.test.ColorvalueOf(java.lang.Stringarg0);
  28. }

下面我们就详细介绍enum定义的枚举类的特征及其用法。(后面均用Color举例)

1、Color枚举类就是class,而且是一个不可以被继承的final类。其枚举值(RED,BLUE...)都是Color类型的类静态常量,我们可以通过下面的方式来得到Color枚举类的一个实例:
Color c=Color.RED;
注意:这些枚举值都是public static final的,也就是我们经常所定义的常量方式,因此枚举类中的枚举值最好全部大写。

2、即然枚举类是class,当然在枚举类型中有构造器,方法和数据域。但是,枚举类的构造器有很大的不同:
(1) 构造器只是在构造枚举值的时候被调用。

Java代码
  1. enumColor{
  2. RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0);
  3. //构造枚举值,比如RED(255,0,0)
  4. privateColor(intrv,intgv,intbv){
  5. this.redValue=rv;
  6. this.greenValue=gv;
  7. this.blueValue=bv;
  8. }
  9. publicStringtoString(){//覆盖了父类Enum的toString()
  10. returnsuper.toString()+"("+redValue+","+greenValue+","+blueValue+")";
  11. }
  12. privateintredValue;//自定义数据域,private为了封装。
  13. privateintgreenValue;
  14. privateintblueValue;
  15. }

(2) 构造器只能私有private,绝对不允许有public构造器。这样可以保证外部代码无法新构造枚举类的实例。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。 但枚举类的方法和数据域可以允许外部访问。

Java代码
  1. publicstaticvoidmain(Stringargs[])
  2. {
  3. //Colorcolors=newColor(100,200,300);//wrong
  4. Colorcolor=Color.RED;
  5. System.out.println(color);//调用了toString()方法
  6. }

3、所有枚举类都继承了Enum的方法,下面我们详细介绍这些方法。
(1) ordinal()方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。
Color.RED.ordinal(); //返回结果:0
Color.BLUE.ordinal(); //返回结果:1
(2) compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。(具体可见源代码)
Color.RED.compareTo(Color.BLUE); //返回结果 -1
(3) values()方法: 静态方法,返回一个包含全部枚举值的数组。
Color[] colors=Color.values();
for(Color c:colors){
System.out.print(c+",");
}//返回结果:RED,BLUE,BLACK YELLOW,GREEN,
(4) toString()方法: 返回枚举常量的名称。
Color c=Color.RED;
System.out.println(c);//返回结果: RED
(5) valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。
Color.valueOf("BLUE"); //返回结果: Color.BLUE
(6) equals()方法: 比较两个枚举类对象的引用。

Java代码
  1. //JDK源代码:
  2. publicfinalbooleanequals(Objectother){
  3. returnthis==other;
  4. }


4、枚举类可以在switch语句中使用。

Java代码
  1. Colorcolor=Color.RED;
  2. switch(color){
  3. caseRED:System.out.println("it'sred");break;
  4. caseBLUE:System.out.println("it'sblue");break;
  5. caseBLACK:System.out.println("it'sblue");break;
  6. }

转自:http://www.cnblogs.com/frankliiu-java/archive/2010/12/07/1898721.html
分享到:
评论

相关推荐

    详解Java的Enum的使用与分析

    主要介绍了详解Java的Enum的使用与分析的相关资料,需要的朋友可以参考下

    java中enum的用法

    主要介绍了java中enum的用法,包括了枚举类型的基本定义及用法分析,对于学习Java有着一定的学习与借鉴价值,需要的朋友可以参考下

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    必须要时从Java SE API的源代码分析,了解各种语法在Java SE API中如何应用。  《Java JDK 7学习笔记》将IDE操作纳为教学内容之一,使读者能与实践结合,提供的视频教学能更清楚地帮助读者掌握操作步骤。 内容简介 ...

    Java开发详解.zip

    031713_【第17章:Java数据库编程】_使用元数据分析数据库笔记.pdf 031714_【第17章:Java数据库编程】_使用JDBC连接Oracle笔记.pdf 031801_【第18章:图形界面】_AWT、Swing简介笔记.pdf 031802_【第18章:图形界面...

    JAVA面向对象详细资料

    Java面向对象 1 1 学习方法与要求 1 2 面向对象语言与面向过程语言的区别 7 3 面向对象?什么对象? 8 4 什么是类? 9 5 如何创建一个类Class? 10 6 如何使用类创建对象 10 7 引用与实例 11 8 实例属性与实例方法 ...

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    关于基本数据类型与包装数据类型的使用标准,下列哪些说法符合《阿里巴巴Java开发手册》:ABD A .所有的POJO类属性必须使用包装数据类型。 B .RPC方法的返回值和参数必须使用包装数据类型。 C .因为JAVA的自动...

    Java开发技术大全 电子版

    11.2.8枚举(Enum)使用示例355 11.2.9枚举集(EnumSet)使用示例358 11.3常用算法361 11.3.1Collections中的简单算法361 11.3.2排序362 11.3.3二分查找364 11.4遗留的类和接口366 11.4.1Enumeration接口简介...

    i18n-maven-plugin:构建时Java本地化检查器

    这个想法是在Java代码中使用一些标记(@Annotations)来提供有关已定义的本地化消息的信息。 然后在构建时,maven插件将使用此信息来分析和检查代码文件和属性文件是否同步。 简单的例子 (这是 ): // Messages...

    BelTMemcached(可以和Java,Php通信).Net部分

    通过telnet memcache服务及memcache协议发现flag不一致,进一步分析源码,得到以下不同: .NET internal enum SerializedType : ushort { ByteArray = 0, Object = 1, String = 2, Datetime = 3, Bool = 4, ...

    resha-turkish-stemmer:一种快速且攻击性较低的 Java 土耳其语词干分析器

    Resha 是用 Java 编写的快速且“不那么激进”的土耳其语词干分析器。 它使用由使用基于词素 n-gram 的统计语言模型生成的词干词典。 所以它返回一个词最可能的词干而不考虑相邻词。 ####主要特点 与其他可用于...

    Java实现高效的枚举元素集合

    Set是Java集合类的重要组成部分,它用来存储不能重复的对象。枚举类型也要求其枚举元素各不相同。看起来枚举类型和集合是很相似的。然而枚举类型中的元素不能随意的增加、删除,作为集合而言,枚举类型非常不实用。...

    数据挖掘实验报告.doc

    Weka使 用Java写成的,并且限制在GNU通用公共证书的条件下发布。它可以运行于几乎所有操作 平台,是一款免费的,非商业化的机器学习以及数据挖掘软件。Weka提供了一个统一界 面,可结合预处理以及后处理方法,将许多...

    MySQL 5.1中文手冊

    5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中的复制 6.1....

    mysql官方中文参考手册

    5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中的复制 6.1....

    MYSQL中文手册

    5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中的...

    mysql5.1中文手册

    在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中...

Global site tag (gtag.js) - Google Analytics