Java中的枚举类型

  一:枚举的引入java

  enum全称enumeration,是JDK1.5中引入的新特性,存放在java.lang包中。下面就平时的学习和使用过程当中用到的进行总结:安全

  枚举(enum),是指一个通过排序的,被打包成一个单一实体的项列表。一个枚举的实例可使用枚举项列表中任意单一项的值。枚举在各个语言当中都有着普遍的应用,一般用来表示颜色,方式,类别,状态等等数目有限,形式离散,表达又极为明确的量。因此Java从JDK1.5以后,引入了对枚举的支持。函数

  那么在枚举出现以前,若是想表示一组特定的离散值,每每使用一些常量。例如:学习

  

  固然,常量也不只仅局限于int型,诸如char和String等也是不在少数。然而,不管使用什么样的类型,这样作都有不少的坏处。这些常量一般都是连续、有无穷多个值的量,而相似这种表示类别的量则是离散的,而且一般状况下只有有限个值。用连续的量去表示离散量,会产生不少问题。例如,针对上述的Entity类,若是要对Entity对象的type属性进行赋值,通常会采用以下方法:spa

  

  这样作的缺点有:(1)代码可读性差、易用性低。因为setType()方法的参数是int型的,在阅读代码的时候每每会让读者感到一头雾水,根本不明白这个2究竟是什么意思,表明的是什么类型。固然,要保证可读性,还有这样一个办法:3d

  

  而这样的话,问题又来了。这样作,客户端必须对这些常量去创建理解,才能了解如何去使用这个东西。说白了,在调用的时候,若是用户不到Entity类中去看看,还真不知道这个参数应该怎么传、怎么调。像是setType(2)这种用法也是在所不免,由于它彻底合法,不是每一个人都可以创建起用常量名代替数值,从而增长程序可读性、下降耦合性的意识。code

  (2)类型不安全。在用户去调用的时候,必须保证类型彻底一致,同时取值范围也要正确。像是setType(-1)这样的调用是合法的,但它并不合理,从此会为程序带来种种问题。也许你会说,加一个有效性验证嘛,可是,这样作的话,又会引出下面的第(3)个问题。对象

  (3)耦合性高,扩展性差。假如,由于某些缘由,须要修改Entity类中常量的值,那么,全部用到这些常量的代码也就都须要修改——固然,要仔细地修改,万一漏了一个,那可不是开玩笑的。同时,这样作也不利于扩展。例如,假如针对类别作了一个有效性验证,若是类别增长了或者有所变更,则有效性验证也须要作对应的修改,不利于后期维护。blog

  枚举就是为了这样的问题而诞生的。它们给出了将一个任意项同另外一个项相比较的能力,而且能够在一个已定义项列表中进行迭代。枚举(在Jave中简称为enum)是一个特定类型的类。全部枚举都是Java中的新类java.lang.Enum的隐式子类。此类不能手工进行子类定义。一个简单的枚举能够是这样:排序

  

  上面的Entity类就能够改为这样:

  

  在为Entity对象赋值的时候,就能够这样:

  

  怎么看,都是好了不少。在调用setType()时,可选值只有四个,不然会出现编译错误,所以能够看出,枚举是类型安全的,不会出现取值范围错误的问题。同时,客户端不须要创建对枚举中常量值的了解,使用起来很方便,而且能够容易地对枚举进行修改,而无需修改客户端。若是常量从枚举中被删除了,那么客户端将会失败而且将会收到一个错误消息。枚举中的常量名称能够被打印,所以除了仅仅获得列表中项的序号外还能够获取更多信息。

  二:枚举的语法定义

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

  

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

  

  三:枚举的例子

  例一:

  

  例二:

  

 

  都是当前枚举类的实例。

相关文章
相关标签/搜索